亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C#通用數據庫操作類

2019-11-14 13:31:39
字體:
來源:轉載
供稿:網友

ADO.NET操作

使用ADO.NET的方式操作數據庫時,對于經常需要操作不同數據庫的同學,需要對不同的數據庫翻來覆去地寫操作類。


對ADO.NET,操作數據庫需要有幾個核心的東西(以MySQL為例):

MySqlConnection

負責mysql的連接,在操作mysql前,需要先獲得連接。

MySqlCommand

負責具體命令的類,具體需要執行的sql的語句需要放到它的CommandText下。

MySqlDataAdapter

對于查詢數據,可以選擇使用DataAdapter將數據一次性取出到DataSet或者DataTable中。

MySqlDataReader

對于查詢數據,同樣可以使用Reader類對數據進行讀取,與Adapter不同,Reader一次取得一條數據,可以在數據獲取的過程中執行代碼,而不需要等待數據一次性取出。

對于mysql有以上的幾個主要類,對于SQLite、SQL Server,同樣類似。
可以使用一個類來將他們包裝,然后編譯成dll,這樣如果需要操作不同的數據庫,只需要通過工廠創建不同的類即可。

提取相同點

使用ADO.NET方式的數據庫驅動,他們都滿足這么幾個特點:

  • 上面列出的核心類都提供,而且都從對應的基類繼承,例如MySqlConnection從SqlConnection繼承。
  • Command類可以通過對應Connection的CreateCommand方法生成。

那么問題就簡單了,我們只要操作他們的基類就可以了。然后他們的引用通過nuget獲得,這樣就能正常編譯。

//主要代碼    /// <summary>    /// 可以根據支持的Sql類型增加或刪除類型,需要增加或刪除對應的GetConnection和GetDbDataAdapter方法。    /// </summary>    public enum SqlType    {        SqlServer,        MySql,        PostgresQL,        Oracle,        SQLite,        //對ODBC方式需要格外注意,目標系統必須預先安裝有對應的數據驅動,如果使用DSN,那么還需要使用配置ODBC數據源        Odbc    }    /// <summary>    /// 使用ADO.NET控制對數據庫的基本訪問方法,對同一個活動對象(不關閉)線程安全。    /// </summary>    public class SqlManipulation : IDisposable    {        public SqlManipulation(string strDSN, SqlType sqlType)        {            _sqlType = sqlType;            _strDSN = strDSN;        }        #region PRivate variables        private SqlType _sqlType;        private string _strDSN;        private DbConnection _conn;        private bool _disposed;        #endregion        private DbConnection GetConnection()        {            DbConnection conn;            switch (_sqlType)            {                case SqlType.SqlServer:                    conn = new SqlConnection(_strDSN);                    return conn;                case SqlType.MySql:                    conn = new MySqlConnection(_strDSN);                    return conn;                case SqlType.PostgresQL:                    conn = new NpgsqlConnection(_strDSN);                    return conn;                case SqlType.Oracle:                    conn = new OracleConnection(_strDSN);                    return conn;                case SqlType.SQLite:                    conn = new SQLiteConnection(_strDSN);                    return conn;                case SqlType.Odbc:                    conn = new OdbcConnection(_strDSN);                    return conn;                default:                    return null;            }        }        private DbDataAdapter GetDbDataAdapter(string sql)        {            DbDataAdapter adp;            switch (_sqlType)            {                case SqlType.SqlServer:                    adp = new SqlDataAdapter(sql, _conn as SqlConnection);                    return adp;                case SqlType.MySql:                    adp = new MySqlDataAdapter(sql, _conn as MySqlConnection);                    return adp;                case SqlType.PostgresQL:                    adp = new NpgsqlDataAdapter(sql, _conn as NpgsqlConnection);                    return adp;                case SqlType.Oracle:                    adp = new OracleDataAdapter(sql, _conn as OracleConnection);                    return adp;                case SqlType.SQLite:                    adp = new SQLiteDataAdapter(sql, _conn as SQLiteConnection);                    return adp;                case SqlType.Odbc:                    adp = new OdbcDataAdapter(sql, _conn as OdbcConnection);                    return adp;                default:                    return null;            }        }        private DbCommand GetCommand(DbConnection conn, string strSQL)        {            DbCommand command = conn.CreateCommand();            command.CommandText = strSQL;            return command;        }        /// <summary>        /// 初始化連接并打開        /// </summary>        /// <returns></returns>        public bool Init()        {            try            {                _conn = GetConnection();                _conn.Open();                return true;            }            catch (Exception e)            {                //記錄日志,退出                MessageBox.Show(e.Message, "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);                return false;            }        }        /// <summary>        /// 執行SELECT查詢語句,并返回DataTable對象。        /// </summary>        /// <param name="strSQL">需要執行的sql語句</param>        /// <returns>DataTable對象</returns>        public DataTable ExcuteQuery(string strSQL)        {            DbDataAdapter adp = GetDbDataAdapter(strSQL);            DataTable dt = new DataTable();            try            {                adp.Fill(dt);            }            catch (Exception e)            {                //記錄日志,并返回空                MessageBox.Show(strSQL + "/n" + e.Message, "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);                return null;            }            return dt;        }        /// <summary>        /// 執行非Select語句,包括UPDATE DELETE INSERT        /// </summary>        /// <param name="strSQL">需要執行的sql語句</param>        /// <returns>受影響的行數</returns>        public int ExcuteNonQuery(string strSQL)        {            //實例化OdbcCommand對象            DbCommand myCmd = GetCommand(_conn, strSQL);            try            {                //執行方法                return myCmd.ExecuteNonQuery();            }            catch (Exception e)            {                //記錄日志,并返回0                MessageBox.Show(strSQL + "/n" + e.Message, "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);                return 0;            }        }        /// <summary>        /// 通過事務批量執行非查詢SQL語句        /// </summary>        /// <param name="strSQLs">需要批量執行的SQL</param>        /// <returns>受影響的行數,發生回滾則返回-1</returns>        public int ExecuteNonQueryTransaction(List<string> strSQLs)        {            DbCommand myCmd = GetCommand(_conn, "");            int sumAffected = 0;            DbTransaction transaction = _conn.BeginTransaction();            myCmd.Transaction = transaction;            try            {                foreach (var n in strSQLs)                {                    myCmd.CommandText = n;                    sumAffected += myCmd.ExecuteNonQuery();                }                transaction.Commit();                return sumAffected;            }            catch (Exception e)            {                MessageBox.Show(e.Message, "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);                transaction.Rollback();                return -1;            }        }    }
  • 由于不同數據庫對數據類型的實現不同,不同數據庫在操作command parameter上也有一些不同,所以暫時沒有加入到此類中去。
  • 最開始,想使用反射來達到目的,可以避免switch分支,后來想起反射需要知道Assembly名稱,寫這段代碼還不如直接switch。

完整項目代碼github地址:https://github.com/circler3/DatabaseInvoke.git
(現在已經對mysql、sql server、posgresql、sqlite和ODBC方式支持)

未來的改進

  1. 考慮添加EF的支持(引用使用EF的程序,主程序app.config或者web.config需要添加配置項目)
  2. 代碼重構
  3. 數據庫現在是持續保持打開,擬增加其他選項

寫在最后

程序比較簡單,代碼放在github上,歡迎交流。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品美女网站| 午夜精品国产精品大乳美女| 日韩精品视频中文在线观看| 久久99精品久久久久久琪琪| 国产成人精品在线播放| 日韩最新中文字幕电影免费看| 久久久成人的性感天堂| 91免费精品视频| 97婷婷涩涩精品一区| 亚洲热线99精品视频| 日韩视频一区在线| 欧美人在线视频| 亚洲人成在线观看| 久久精品小视频| 国产精品老女人视频| 亚洲va久久久噜噜噜久久天堂| 国产丝袜精品第一页| 久久久91精品| 亚洲人成在线一二| 欧美日韩国产一区二区三区| 亚洲精品视频在线播放| 91国产中文字幕| 国产美女精品视频免费观看| 中文字幕国产精品| 91经典在线视频| 亚洲另类xxxx| 最新91在线视频| 最近中文字幕mv在线一区二区三区四区| 欧美一级淫片播放口| 98午夜经典影视| 欧美最顶级的aⅴ艳星| 国产精品久久久久久亚洲调教| 日产精品久久久一区二区福利| 国产a级全部精品| 久久久国产精彩视频美女艺术照福利| 91在线观看免费网站| 欧美夫妻性生活xx| 日本精品久久久久影院| 国产精品视频不卡| 亚洲女人初尝黑人巨大| 日韩在线精品一区| 久热精品视频在线观看| 欧美日韩国产专区| 亚洲国语精品自产拍在线观看| 亚洲视频电影图片偷拍一区| 欧美日韩亚洲高清| 九九热在线精品视频| 狠狠色香婷婷久久亚洲精品| 成人免费观看49www在线观看| 精品亚洲精品福利线在观看| 国产xxx69麻豆国语对白| 久久国产精品久久久久久| 日本精品一区二区三区在线播放视频| 国产精品免费福利| 91a在线视频| 亚洲欧美在线免费观看| 亚洲精品v天堂中文字幕| 成人黄色在线免费| 亚洲摸下面视频| 欧美精品午夜视频| 亚洲成色999久久网站| 亚洲精品mp4| 亚洲精品国产精品久久清纯直播| 国产精品99久久久久久人| www.国产精品一二区| 久久亚洲精品国产亚洲老地址| 久久久久久国产精品三级玉女聊斋| 久久国产色av| 久精品免费视频| 亚洲国产日韩欧美在线99| 中文字幕日韩精品在线| 精品自拍视频在线观看| 国产一区二区三区直播精品电影| 一本一本久久a久久精品牛牛影视| 国产亚洲欧美日韩精品| 久久精品中文字幕| 疯狂做受xxxx高潮欧美日本| 亚洲色图50p| 国产伦精品免费视频| 超碰日本道色综合久久综合| 国产精品69精品一区二区三区| 亚洲色图国产精品| 久久精品国产成人精品| 亚洲三级av在线| 最新亚洲国产精品| 国产日韩在线免费| 欧美激情a∨在线视频播放| 欧美特黄级在线| 国产精品视频中文字幕91| 欧美国产日韩一区二区在线观看| 欧美三级免费观看| 国产成人一区二区三区| 91精品国产91久久久久久久久| 国产精品户外野外| 尤物九九久久国产精品的特点| 亚洲影视中文字幕| 久久免费视频网| 亚洲a在线播放| 久久精品免费播放| 91精品啪aⅴ在线观看国产| 国产视频精品久久久| 国产亚洲欧美aaaa| 国产精国产精品| 日韩在线观看免费全| 久热精品视频在线免费观看| 日本久久亚洲电影| 91精品视频在线免费观看| 日韩av一区在线| 精品性高朝久久久久久久| 国产97人人超碰caoprom| 欧美黄色成人网| 久久久免费电影| 欧美视频国产精品| 亚洲全黄一级网站| 国内精品久久久久伊人av| 日韩av在线精品| 国产精品18久久久久久麻辣| 91高清免费在线观看| 亚洲精品一区在线观看香蕉| 国产91成人在在线播放| 97国产精品视频人人做人人爱| 4438全国亚洲精品在线观看视频| 伊人伊人伊人久久| 亚洲成人中文字幕| 欧美激情在线有限公司| www.xxxx欧美| 久久精品小视频| 日韩精品中文在线观看| 亚洲视频国产视频| 色琪琪综合男人的天堂aⅴ视频| 日本精品久久中文字幕佐佐木| 国产一区二区成人| 国产精品天天狠天天看| 国产亚洲精品91在线| 亚洲视频视频在线| 国模精品视频一区二区| 色婷婷**av毛片一区| 亚洲欧美日韩视频一区| 久久免费在线观看| 欧美日韩精品中文字幕| 国产精品女主播| 国产视频自拍一区| 不卡在线观看电视剧完整版| 国产日本欧美一区二区三区| 亚洲成年人影院在线| 色阁综合伊人av| 欧美最猛性xxxx| 久久久精品日本| 日韩电影免费在线观看中文字幕| 亚洲电影中文字幕| 国产精品r级在线| 成人免费自拍视频| 国产在线久久久| 亚洲精品日韩丝袜精品| 国产亚洲欧美日韩精品| 欧美体内谢she精2性欧美| 欧美在线欧美在线| www.日韩视频| 国产精品白嫩初高中害羞小美女| 国语自产精品视频在线看抢先版图片| 日韩在线不卡视频| 97在线视频一区| 亚洲精品久久久久中文字幕二区| 91精品视频播放|