国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

C#通用數(shù)據(jù)庫操作類

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

ADO.NET操作

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


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

MySqlConnection

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

MySqlCommand

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

MySqlDataAdapter

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

MySqlDataReader

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

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

提取相同點

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

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

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

//主要代碼    /// <summary>    /// 可以根據(jù)支持的Sql類型增加或刪除類型,需要增加或刪除對應的GetConnection和GetDbDataAdapter方法。    /// </summary>    public enum SqlType    {        SqlServer,        MySql,        PostgresQL,        Oracle,        SQLite,        //對ODBC方式需要格外注意,目標系統(tǒng)必須預先安裝有對應的數(shù)據(jù)驅動,如果使用DSN,那么還需要使用配置ODBC數(shù)據(jù)源        Odbc    }    /// <summary>    /// 使用ADO.NET控制對數(shù)據(jù)庫的基本訪問方法,對同一個活動對象(不關閉)線程安全。    /// </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>        /// 執(zhí)行SELECT查詢語句,并返回DataTable對象。        /// </summary>        /// <param name="strSQL">需要執(zhí)行的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>        /// 執(zhí)行非Select語句,包括UPDATE DELETE INSERT        /// </summary>        /// <param name="strSQL">需要執(zhí)行的sql語句</param>        /// <returns>受影響的行數(shù)</returns>        public int ExcuteNonQuery(string strSQL)        {            //實例化OdbcCommand對象            DbCommand myCmd = GetCommand(_conn, strSQL);            try            {                //執(zhí)行方法                return myCmd.ExecuteNonQuery();            }            catch (Exception e)            {                //記錄日志,并返回0                MessageBox.Show(strSQL + "/n" + e.Message, "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);                return 0;            }        }        /// <summary>        /// 通過事務批量執(zhí)行非查詢SQL語句        /// </summary>        /// <param name="strSQLs">需要批量執(zhí)行的SQL</param>        /// <returns>受影響的行數(shù),發(fā)生回滾則返回-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;            }        }    }
  • 由于不同數(shù)據(jù)庫對數(shù)據(jù)類型的實現(xiàn)不同,不同數(shù)據(jù)庫在操作command parameter上也有一些不同,所以暫時沒有加入到此類中去。
  • 最開始,想使用反射來達到目的,可以避免switch分支,后來想起反射需要知道Assembly名稱,寫這段代碼還不如直接switch。

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

未來的改進

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

寫在最后

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


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 梅河口市| 巴彦县| 唐海县| 凯里市| 灵武市| 古浪县| 安丘市| 上饶县| 巴楚县| 舒城县| 堆龙德庆县| 慈溪市| 辉县市| 封开县| 蚌埠市| 凌海市| 江都市| 杨浦区| 临西县| 苍溪县| 衡阳市| 亳州市| 鲁甸县| 凉城县| 长宁县| 任丘市| 微山县| 织金县| 奇台县| 南昌县| 潼关县| 海兴县| 澄城县| 罗甸县| 利津县| SHOW| 淄博市| 定西市| 明水县| 增城市| 逊克县|