國產化之 .NET Core 操作達夢資料庫DM8的兩種方式

来源:https://www.cnblogs.com/bossma/archive/2022/04/19/16163640.html
-Advertisement-
Play Games

為了寫入Bootloader, 要開啟SSH, 要開啟SSH, 就需要將小米路由器的 ROM 更新為開發版. 在小米的 miwifi 下載頁面找到路由器對應的開發版 ROM(R3G ROM 開發版). ROM 的升級有兩種方式 登陸路由器後臺線上升級 如果前一個方式不行, 可以將其拷貝到U盤根目錄... ...


背景

某個項目需要實現基礎軟體全部國產化,其中操作系統指定銀河麒麟,資料庫使用達夢V8,CPU平臺的範圍包括x64、龍芯、飛騰、鯤鵬等。考慮到這些基礎產品對.NET的支持,最終選擇了.NET Core 3.1。

環境

  • CPU平臺:x86-64 / Arm64
  • 操作系統:銀河麒麟 v4
  • 資料庫:DM8
  • .NET:.NET Core 3.1

SDK

達夢自己提供了.NET操作其資料庫的SDK,可以通過NuGet安裝,也可以通過安裝達夢資料庫獲取。因為NuGet上的版本不知道是誰提供的,所以這裡以安裝資料庫獲取相關SDK為例。

在官網下載DM8的資料庫安裝文件:https://www.dameng.com/list_103.html

下載前需要先登錄,隨便註冊一個帳號就好了。

這裡需要選擇CPU和操作系統,按照你的開發環境選擇即可,下載後按照提示安裝。

img

這裡以Windows10為例,安裝後SDK文件的位置在:C:\dmdbms\drivers\dotNet

這裡邊有EF的SDK,也有NHibernate的SDK,不過這篇文章只使用最基礎的基於ADO.NET的SDK。

這些SDK在文件夾DmProvider下邊,這裡還提供了一個Nuget包,可以放到自己的Nuget倉庫中,方便內部安裝。

img

可以看到,這個SDK可以支持.NET Core2.0以上的所有.NET版本。

操作資料庫

這裡提供兩種方式:傳統的DbHelperSQL方式 和 Dapper 方式。

DbHelperSQL方式

這種方式早年用的比較多,現在還有很多項目在使用,通過定義一組工具方法包裝對資料庫的各種增刪改查操作。下麵給出代碼:

    public class DmDbClient
    {
        private string connectionString = string.Empty;

        /// <summary>
        /// 初始化DMClient的一個新實例
        /// </summary>
        /// <param name="str"></param>
        public DmDbClient(string str)
        {
            connectionString = str;
        }

        #region 通用快捷方法
        /// <summary>
        /// 執行一條SQL語句,確定記錄是否存在
        /// </summary>
        /// <param name="sql">SQL查詢語句</param>
        /// <returns></returns>
        public bool Exists(string sql)
        {
            object obj = GetSingle(sql);

            int cmdresult;
            if (Equals(obj, null) || Equals(obj, DBNull.Value))
            {
                cmdresult = 0;
            }
            else
            {
                cmdresult = int.Parse(obj.ToString());
            }

            return cmdresult > 0;
        }

        /// <summary>
        /// 執行一條SQL語句,確定記錄是否存在
        /// </summary>
        /// <param name="sql">SQL查詢語句</param>
        /// <returns></returns>
        public async Task<bool> ExistsAsync(string sql)
        {
            object obj = await GetSingleAsync(sql);

            int cmdresult;
            if (Equals(obj, null) || Equals(obj, DBNull.Value))
            {
                cmdresult = 0;
            }
            else
            {
                cmdresult = int.Parse(obj.ToString());
            }

            return cmdresult > 0;
        }

        /// <summary>
        /// 執行一條SQL語句,確定記錄是否存在
        /// </summary>
        /// <param name="sql">SQL查詢語句</param>
        /// <param name="paras">SQL參數數組</param>
        /// <returns></returns>
        public bool Exists(string sql, params DmParameter[] paras)
        {
            object obj = GetSingle(sql, paras);

            int cmdresult;
            if ((object.Equals(obj, null)) || (object.Equals(obj, DBNull.Value)))
            {
                cmdresult = 0;
            }
            else
            {
                cmdresult = int.Parse(obj.ToString());
            }

            return cmdresult > 0;
        }

        /// <summary>
        /// 執行一條SQL語句,確定記錄是否存在
        /// </summary>
        /// <param name="sql">SQL查詢語句</param>
        /// <param name="paras">SQL參數數組</param>
        /// <returns></returns>
        public async Task<bool> ExistsAsync(string sql, params DmParameter[] paras)
        {
            object obj = await GetSingleAsync(sql, paras);

            int cmdresult;
            if ((object.Equals(obj, null)) || (object.Equals(obj, DBNull.Value)))
            {
                cmdresult = 0;
            }
            else
            {
                cmdresult = int.Parse(obj.ToString());
            }

            return cmdresult > 0;
        }

        /// <summary>
        /// 獲取記錄條數
        /// </summary>
        /// <param name="tableName">表名</param>
        /// <param name="sqlCondition">查詢條件</param>
        /// <returns></returns>
        public int GetCount(string tableName, string sqlCondition)
        {
            string sql = "select count(1) from `" + tableName + "`";

            if (!string.IsNullOrWhiteSpace(sqlCondition))
            {
                sql += " where " + sqlCondition;
            }

            object result = GetSingle(sql);

            if (result != null)
            {
                return Convert.ToInt32(result);
            }
            else
            {
                return 0;
            }
        }

        /// <summary>
        /// 獲取記錄條數
        /// </summary>
        /// <param name="tableName">表名</param>
        /// <param name="sqlCondition">查詢條件</param>
        /// <returns></returns>
        public async Task<int> GetCountAsync(string tableName, string sqlCondition)
        {
            string sql = "select count(1) from `" + tableName + "`";

            if (!string.IsNullOrWhiteSpace(sqlCondition))
            {
                sql += " where " + sqlCondition;
            }

            object result = await GetSingleAsync(sql);

            if (result != null)
            {
                return Convert.ToInt32(result);
            }
            else
            {
                return 0;
            }
        }

        /// <summary>
        /// 獲取記錄條數
        /// </summary>
        /// <param name="tableName">表名</param>
        /// <param name="sqlCondition">查詢條件</param>
        /// <param name="paras">SQL參數數組</param>
        /// <returns></returns>
        public int GetCount(string tableName, string sqlCondition, DmParameter[] paras)
        {
            string sql = "select count(1) from `" + tableName + "`";

            if (!string.IsNullOrWhiteSpace(sqlCondition))
            {
                sql += " where " + sqlCondition;
            }

            object result = GetSingle(sql, paras);

            if (result != null)
            {
                return Convert.ToInt32(result);
            }
            else
            {
                return 0;
            }
        }

        /// <summary>
        /// 獲取記錄條數
        /// </summary>
        /// <param name="tableName">表名</param>
        /// <param name="sqlCondition">查詢條件</param>
        /// <param name="paras">SQL參數數組</param>
        /// <returns></returns>
        public async Task<int> GetCountAsync(string tableName, string sqlCondition, DmParameter[] paras)
        {
            string sql = "select count(1) from `" + tableName + "`";

            if (!string.IsNullOrWhiteSpace(sqlCondition))
            {
                sql += " where " + sqlCondition;
            }

            object result = await GetSingleAsync(sql, paras);

            if (result != null)
            {
                return Convert.ToInt32(result);
            }
            else
            {
                return 0;
            }
        }

        #endregion 通用快捷方法

        #region 執行簡單SQL語句

        /// <summary>
        /// 執行SQL語句,返回影響的記錄數
        /// </summary>
        /// <param name="sql">SQL語句</param>
        /// <returns>影響的記錄數</returns>
        public int ExecuteSql(string sql)
        {
            using (DmConnection connection = new DmConnection(connectionString))
            {
                using (DmCommand cmd = new DmCommand(sql, connection))
                {
                    connection.Open();
                    int rows = cmd.ExecuteNonQuery();
                    return rows;
                }
            }
        }

        /// <summary>
        /// 執行SQL語句,返回影響的記錄數
        /// </summary>
        /// <param name="sql">SQL語句</param>
        /// <returns>影響的記錄數</returns>
        public async Task<int> ExecuteSqlAsync(string sql)
        {
            using (DmConnection connection = new DmConnection(connectionString))
            {
                using (DmCommand cmd = new DmCommand(sql, connection))
                {
                    await connection.OpenAsync();
                    int rows = await cmd.ExecuteNonQueryAsync();
                    return rows;
                }
            }
        }

        /// <summary>
        /// 執行SQL語句,返回影響的記錄數(可自定義超時時間)
        /// </summary>
        /// <param name="sql">SQL語句</param>
        /// <param name="timeout">執行超時時間</param>
        /// <returns>影響的記錄數</returns>
        public int ExecuteSqlByTime(string sql, int timeout)
        {
            using (DmConnection connection = new DmConnection(this.connectionString))
            {
                using (DmCommand cmd = new DmCommand(sql, connection))
                {
                    connection.Open();
                    cmd.CommandTimeout = timeout;
                    int rows = cmd.ExecuteNonQuery();
                    return rows;
                }
            }
        }

        /// <summary>
        /// 執行SQL語句,返回影響的記錄數(可自定義超時時間)
        /// </summary>
        /// <param name="sql">SQL語句</param>
        /// <param name="timeout">執行超時時間</param>
        /// <returns>影響的記錄數</returns>
        public async Task<int> ExecuteSqlByTimeAsync(string sql, int timeout)
        {
            using (DmConnection connection = new DmConnection(this.connectionString))
            {
                using (DmCommand cmd = new DmCommand(sql, connection))
                {
                    await connection.OpenAsync();
                    cmd.CommandTimeout = timeout;
                    int rows = await cmd.ExecuteNonQueryAsync();
                    return rows;
                }
            }
        }

        /// <summary>
        /// 執行多條SQL語句,實現資料庫事務。
        /// </summary>
        /// <param name="sqlList">多條SQL語句</param>
        public void ExecuteSqlTrans(ArrayList sqlList)
        {
            using (DmConnection conn = new DmConnection(connectionString))
            {
                conn.Open();
                using (DbTransaction trans = conn.BeginTransaction())
                {
                    using (DmCommand cmd = new DmCommand())
                    {
                        cmd.Connection = conn;
                        cmd.Transaction = trans;

                        try
                        {
                            for (int n = 0; n < sqlList.Count; n++)
                            {
                                string sql = sqlList[n].ToString();

                                if (sql.Trim().Length > 1)
                                {
                                    cmd.CommandText = sql;
                                    cmd.ExecuteNonQuery();
                                }
                            }

                            trans.Commit();
                        }
                        catch (DmException ex)
                        {
                            trans.Rollback();
                            throw ex;
                        }
                    }
                }
            }
        }

        /// <summary>
        /// 執行多條SQL語句,實現資料庫事務。
        /// </summary>
        /// <param name="sqlList">多條SQL語句</param>
        public async Task ExecuteSqlTransAsync(ArrayList sqlList)
        {
            using (DmConnection conn = new DmConnection(connectionString))
            {
                await conn.OpenAsync();
                using (DbTransaction trans = await conn.BeginTransactionAsync())
                {
                    using (DmCommand cmd = new DmCommand())
                    {
                        cmd.Connection = conn;
                        cmd.Transaction = trans;

                        try
                        {
                            for (int n = 0; n < sqlList.Count; n++)
                            {
                                string sql = sqlList[n].ToString();

                                if (sql.Trim().Length > 1)
                                {
                                    cmd.CommandText = sql;
                                    await cmd.ExecuteNonQueryAsync();
                                }
                            }

                            trans.Commit();
                        }
                        catch (DmException ex)
                        {
                            trans.Rollback();
                            throw ex;
                        }
                    }
                }
            }
        }

        /// <summary>
        /// 執行一條SQL查詢語句,返回查詢結果。
        /// </summary>
        /// <param name="sql">SQL查詢語句</param>
        /// <returns>查詢結果</returns>
        public object GetSingle(string sql)
        {
            using (DmConnection connection = new DmConnection(connectionString))
            {
                using (DmCommand cmd = new DmCommand(sql, connection))
                {
                    connection.Open();

                    object obj = cmd.ExecuteScalar();

                    if ((object.Equals(obj, null)) || (object.Equals(obj, DBNull.Value)))
                    {
                        return null;
                    }
                    else
                    {
                        return obj;
                    }
                }
            }
        }

        /// <summary>
        /// 執行一條SQL查詢語句,返回查詢結果。
        /// </summary>
        /// <param name="sql">SQL查詢語句</param>
        /// <returns>查詢結果</returns>
        public async Task<object> GetSingleAsync(string sql)
        {
            using (DmConnection connection = new DmConnection(connectionString))
            {
                using (DmCommand cmd = new DmCommand(sql, connection))
                {
                    await connection.OpenAsync();

                    object obj = await cmd.ExecuteScalarAsync();

                    if ((object.Equals(obj, null)) || (object.Equals(obj, DBNull.Value)))
                    {
                        return null;
                    }
                    else
                    {
                        return obj;
                    }
                }
            }
        }

        /// <summary>
        /// 執行查詢語句,返回DbDataReader(切記要手工關閉DbDataReader)
        /// </summary>
        /// <param name="sql">查詢語句</param>
        /// <returns>DmDataReader</returns>
        public DbDataReader ExecuteReader(string sql)
        {
            DmConnection connection = new DmConnection(connectionString);
            DmCommand cmd = new DmCommand(sql, connection);

            connection.Open();
            return cmd.ExecuteReader();
        }

        /// <summary>
        /// 執行查詢語句,返回DbDataReader(切記要手工關閉DbDataReader)
        /// </summary>
        /// <param name="sql">查詢語句</param>
        /// <returns>DmDataReader</returns>
        public async Task<DbDataReader> ExecuteReaderAsync(string sql)
        {
            DmConnection connection = new DmConnection(connectionString);
            DmCommand cmd = new DmCommand(sql, connection);

            await connection.OpenAsync();
            return await cmd.ExecuteReaderAsync();
        }

        /// <summary>
        /// 執行查詢語句,返回DataSet
        /// </summary>
        /// <param name="sql">查詢語句</param>
        /// <returns>DataSet</returns>
        public DataSet Query(string sql)
        {
            using (DmConnection connection = new DmConnection(connectionString))
            {
                using (DmDataAdapter command = new DmDataAdapter(sql, connection))
                {
                    DataSet ds = new DataSet();

                    connection.Open();
                    command.Fill(ds, "ds");

                    return ds;
                }
            }
        }

        /// <summary>
        /// 執行查詢語句,返回DataSet(可自定義超時時間)
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="timeout"></param>
        /// <returns></returns>
        public DataSet Query(string sql, int timeout)
        {
            using (DmConnection connection = new DmConnection(connectionString))
            {
                using (DmDataAdapter command = new DmDataAdapter(sql, connection))
                {
                    DataSet ds = new DataSet();

                    connection.Open();
                    command.SelectCommand.CommandTimeout = timeout;
                    command.Fill(ds, "ds");

                    return ds;
                }
            }
        }
        #endregion 執行簡單SQL語句

        #region 執行帶參數的SQL語句

        /// <summary>
        /// 執行SQL語句,返回影響的記錄數
        /// </summary>
        /// <param name="sql">SQL語句</param>
        /// <param name="paras">SQL參數數組</param>
        /// <returns>影響的記錄數</returns>
        public int ExecuteSql(string sql, params DmParameter[] paras)
        {
            using (DmConnection connection = new DmConnection(connectionString))
            {
                using (DmCommand cmd = new DmCommand())
                {
                    PrepareCommand(cmd, connection, null, sql, paras);
                    int rows = cmd.ExecuteNonQuery();
                    cmd.Parameters.Clear();
                    return rows;
                }
            }
        }

        /// <summary>
        /// 執行SQL語句,返回影響的記錄數
        /// </summary>
        /// <param name="sql">SQL語句</param>
        /// <param name="paras">SQL參數數組</param>
        /// <returns>影響的記錄數</returns>
        public async Task<int> ExecuteSqlAsync(string sql, params DmParameter[] paras)
        {
            using (DmConnection connection = new DmConnection(connectionString))
            {
                using (DmCommand cmd = new DmCommand())
                {
                    await PrepareCommandAsync(cmd, connection, null, sql, paras);
                    int rows = await cmd.ExecuteNonQueryAsync();
                    cmd.Parameters.Clear();
                    return rows;
                }
            }
        }

        /// <summary>
        /// 執行添加SQL語句,返回記錄的ID(自動產生的自增主鍵)
        /// </summary>
        /// <param name="sql">SQL語句</param>
        /// <param name="parms">SQL參數</param>
        /// <returns>記錄的ID</returns>
        public int ExecuteAdd(string sql, params DmParameter[] parms)
        {
            sql = sql + ";Select @@IDENTITY";

            using (DmConnection connection = new DmConnection(connectionString))
            {
                using (DmCommand cmd = new DmCommand())
                {
                    PrepareCommand(cmd, connection, null, sql, parms);
                    int recordID = Int32.Parse(cmd.ExecuteScalar().ToString());
                    cmd.Parameters.Clear();

                    return recordID;
                }
            }
        }

        /// <summary>
        /// 執行添加SQL語句,返回記錄的ID(自動產生的自增主鍵)
        /// </summary>
        /// <param name="sql">SQL語句</param>
        /// <param name="parms">SQL參數</param>
        /// <returns>記錄的ID</returns>
        public async Task<int> ExecuteAddAsync(string sql, params DmParameter[] parms)
        {
            sql = sql + ";select @@identity as newautoid";

            using (DmConnection connection = new DmConnection(connectionString))
            {
                using (DmCommand cmd = new DmCommand())
                {
                    await PrepareCommandAsync(cmd, connection, null, sql, parms);

                    int recordID;
                    try
                    {
                        recordID = int.Parse((await cmd.ExecuteScalarAsync()).ToString());
                    }
                    catch
                    {
                        recordID = -1;
                    }

                    cmd.Parameters.Clear();

                    return recordID;
                }
            }
        }

        /// <summary>
        /// 執行多條SQL語句,實現資料庫事務。
        /// </summary>
        /// <param name="sqlList">SQL語句的哈希表(key為sql語句,value是該語句的DmParameter[])</param>
        public void ExecuteSqlTrans(Hashtable sqlList)
        {
            using (DmConnection conn = new DmConnection(connectionString))
            {
                conn.Open();
                using (DbTransaction trans = conn.BeginTransaction())
                {
                    using (DmCommand cmd = new DmCommand())
                    {
                        try
                        {
                            foreach (DictionaryEntry entry in sqlList)
                            {
                                var sql = entry.Key.ToString();
                                var paras = (DmParameter[])entry.Value;

                                PrepareCommand(cmd, conn, trans, sql, paras);

                                int val = cmd.ExecuteNonQuery();

                                cmd.Parameters.Clear();
                            }

                            trans.Commit();
                        }
                        catch (DmException ex)
                        {
                            trans.Rollback();
                            throw ex;
                        }
                    }
                }
            }
        }

        /// <summary>
        /// 執行多條SQL語句,實現資料庫事務。
        /// </summary>
        /// <param name="sqlList">SQL語句的哈希表(key為sql語句,value是該語句的DmParameter[])</param>
        public async Task ExecuteSqlTransAsync(Hashtable sqlList)
        {
            using (DmConnection conn = new DmConnection(connectionString))
            {
                await conn.OpenAsync();
                using (DbTransaction trans = conn.BeginTransaction())
                {
                    using (DmCommand cmd = new DmCommand())
                    {
                        try
                        {
                            foreach (DictionaryEntry entry in sqlList)
                            {
                                var sql = entry.Key.ToString();
                                var paras = (DmParameter[])entry.Value;

                                await PrepareCommandAsync(cmd, conn, trans, sql, paras);

                                int val = await cmd.ExecuteNonQueryAsync();

                                cmd.Parameters.Clear();
                            }

                            trans.Commit();
                        }
                        catch (DmException ex)
                        {
                            trans.Rollback();
                            throw ex;
                        }
                    }
                }
            }
        }

        /// <summary>
        /// 執行一條計算查詢結果語句,返回查詢結果。
        /// </summary>
        /// <param name="sql">SQL語句</param>
        /// <param name="parms">SQL參數</param>
        /// <returns>查詢結果</returns>
        public object GetSingle(string sql, params DmParameter[] parms)
        {
            using (DmConnection conn = new DmConnection(connectionString))
            {
                using (DmCommand cmd = new DmCommand())
                {
                    PrepareCommand(cmd, conn, null, sql, parms);

                    object obj = cmd.ExecuteScalar();
                    cmd.Parameters.Clear();

                    if ((object.Equals(obj, null)) || (object.Equals(obj, DBNull.Value)))
                    {
                        return null;
                    }
                    else
                    {
                        return obj;
                    }
                }
            }
        }

        /// <summary>
        /// 執行一條計算查詢結果語句,返回查詢結果。
        /// </summary>
        /// <param name="sql">SQL語句</param>
        /// <param name="parms">SQL參數</param>
        /// <returns>查詢結果</returns>
        public async Task<object> GetSingleAsync(string sql, params DmParameter[] parms)
        {
            using (DmConnection conn = new DmConnection(connectionString))
            {
                using (DmCommand cmd = new DmCommand())
                {
                    await PrepareCommandAsync(cmd, conn, null, sql, parms);

                    object obj = await cmd.ExecuteScalarAsync();
                    cmd.Parameters.Clear();

                    if ((object.Equals(obj, null)) || (object.Equals(obj, DBNull.Value)))
                    {
                        return null;
                    }
                    else
                    {
                        return obj;
                    }
                }
            }
        }

        /// <summary>
        /// 執行查詢語句,返回DmDataReader (切記要手工關閉DmDataReader)
        /// </summary>
        /// <param name="sql">查詢語句</param>
        /// <param name="parms">SQL參數</param>
        /// <returns>DmDataReader</returns>
        public DbDataReader ExecuteReader(string sql, params DmParameter[] parms)
        {
            DmConnection connection = new DmConnection(connectionString);
            DmCommand cmd = new DmCommand();

            PrepareCommand(cmd, connection, null, sql, parms);

            DbDataReader myReader = cmd.ExecuteReader();
            cmd.Parameters.Clear();

            return myReader;
        }

        /// <summary>
        /// 執行查詢語句,返回DmDataReader (切記要手工關閉DmDataReader)
        /// </summary>
        /// <param name="sql">查詢語句</param>
        /// <param name="parms">SQL參數</param>
        /// <returns>DmDataReader</returns>
        public async Task<DbDataReader> ExecuteReaderAsync(string sql, params DmParameter[] parms)
        {
            DmConnection connection = new DmConnection(connectionString);
            DmCommand cmd = new DmCommand();

            await PrepareCommandAsync(cmd, connection, null, sql, parms);

            var myReader = await cmd.ExecuteReaderAsync();
            cmd.Parameters.Clear();
            return myReader;
        }

        /// <summary>
        /// 執行查詢語句,返回DataSet
        /// </summary>
        /// <param name="sql">查詢語句</param>
        /// <param name="paras">參數數組</param>
        /// <returns>DataSet</returns>
        public DataSet Query(string sql, params DmParameter[] paras)
        {
            using (DmConnection connection = new DmConnection(connectionString))
            {
                using (DmCommand cmd = new DmCommand())
                {
                    PrepareCommand(cmd, connection, null, sql, paras);
                    DataSet ds = new DataSet();

                    using (DmDataAdapter da = new DmDataAdapter(cmd))
                    {
                        da.Fill(ds, "ds");
                        cmd.Parameters.Clear();

                        return ds;
                    }
                }
            }
        }

        /// <summary>
        /// 準備SQL查詢命令
        /// </summary>
        /// <param name="cmd">SQL命令對象</param>
        /// <param name="conn">SQL連接對象</param>
        /// <param name="trans">SQL事務對象</param>
        /// <param name="cmdText">SQL語句</param>
        /// <param name="paras">SQL參數數組</param>
        private void PrepareCommand(DmCommand cmd, DmConnection conn, DbTransaction trans, string cmdText, DmParameter[] paras)
        {
            if (conn.State != ConnectionState.Open)
            {
                conn.Open();
            }

            cmd.Connection = conn;
            cmd.CommandText = cmdText;

            if (trans != null)
            {
                cmd.Transaction = trans;
            }

            cmd.CommandType = CommandType.Text;
            if (paras != null)
            {
                foreach (DmParameter parameter in paras)
                {
                    if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
                        (parameter.Value == null))
                    {
                        parameter.Value = DBNull.Value;
                    }
                    cmd.Parameters.Add(parameter);
                }
            }
        }

        /// <summary>
        /// 準備SQL查詢命令
        /// </summary>
        /// <param name="cmd">SQL命令對象</param>
        /// <param name="conn">SQL連接對象</param>
        /// <param name="trans">SQL事務對象</param>
        /// <param name="cmdText">SQL語句</param>
        /// <param name="paras">SQL參數數組</param>
        private async Task PrepareCommandAsync(DmCommand cmd, DmConnection conn, DbTransaction trans, string cmdText, DmParameter[] paras)
        {
            if (conn.State != ConnectionState.Open)
            {
                await conn.OpenAsync();
            }

            cmd.Connection = conn;
            cmd.CommandText = cmdText;

            if (trans != null)
            {
                cmd.Transaction = trans;
            }

            cmd.CommandType = CommandType.Text;
            if (paras != null)
            {
                foreach (DmParameter parameter in paras)
                {
                    if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
                        (parameter.Value == null))
                    {
                        parameter.Value = DBNull.Value;
                    }
                    cmd.Parameters.Add(parameter);
                }
            }
        }

        #endregion 執行帶參數的SQL語句
    }

使用方法也很簡單,傳入SQL語句和參數即可。這裡給出幾個增刪改查的例子:

    public class PersonAdoNetDAL : IPersonDAL
    {
        static readonly DmDbClient _client = new DmDbClient("Server=127.0.0.1; UserId=TESTDB; PWD=1234567");

        public int Add(PersonModel model)
        {
            string sql = "insert into Person(Name,City) Values(:Name,:City)";
            DmParameter[] paras = new DmParameter[] {
                new DmParameter(":Name",model.Name),
                new DmParameter(":City",model.City)
            };

            return _client.ExecuteAdd(sql, paras);
        }

        public bool Update(PersonModel model)
        {
            string sql = "update Person set City=:City where Id=:Id";
            DmParameter[] paras = new DmParameter[] {
                new DmParameter(":Id",model.Id),
                new DmParameter(":City",model.City)
            };

            return _client.ExecuteSql(sql, paras) > 0 ? true : false;
        }

        public bool Delete(int id)
        {
            string sql = "delete from Person where Id=:Id";
            DmParameter[] paras = new DmParameter[] {
                new DmParameter(":Id",id),
            };

            return _client.ExecuteSql(sql, paras) > 0 ? true : false;
        }

        public PersonModel Get(int id)
        {
            string sql = "select Id,Name,City from Person where Id=:Id";
            DmParameter[] paras = new DmParameter[] {
                new DmParameter(":Id",id),
            };

            PersonModel model = null;
            using (var reader = (DmDataReader)_client.ExecuteReader(sql, paras))
            {
                while (reader.Read())
                {
                    model = new PersonModel();
                    model.Id = reader.GetInt32(0);
                    model.Name = reader.GetString(1);
                    model.City = reader.GetString(2);
                }
            }

            return model;
        }

        public List<PersonModel> GetList()
        {
            var list = new List<PersonModel>();
            using (var reader = (DmDataReader)_client.ExecuteReader("select Id,Name,City from Person"))
            {
                while (reader.Read())
                {
                    var model = new PersonModel();
                    model.Id = reader.GetInt32(0);
                    model.Name = reader.GetString(1);
                    model.City = reader.GetString(2);
                    list.Add(model);
                }
            }

            return list;
        }

    }

需要註意達夢資料庫的參數是用冒號作為首碼的。另外數據表和欄位的名字建議全部使用大寫字母,單詞之間使用下劃線分隔,也就是蛇形命名法。此時SQL語句就不用關心大小寫了,怎麼寫都行。

Dapper方式

Dapper是一個輕量級的ORM框架,現在使用的也很廣泛,可以簡化代碼編寫。因為Dapper擴展的IDbConnection,這是ADO.NET中的東西,我們使用的DmProvider也是實現了ADO.NET相關介面,所以Dapper可以通過DmProvider操作達夢資料庫。

首先定義一個獲取資料庫連接對象的工廠類:

    public class DmConnectionFactory
    {
        static string sqlConnString = "Server=127.0.0.1; UserId=TESTDB; PWD=123456";
        public static IDbConnection GetConn()
        {
            return new DmConnection(sqlConnString);
        }
    }

然後就可以使用它執行SQL語句了:

   public class PersonDapperDAL : IPersonDAL
    {
        public PersonDapperDAL()
        {
        }

        public PersonModel Get(int id)
        {
            string sql = "select Id,Name,City from Person where Id=:Id";
            return DmConnectionFactory.GetConn().QueryFirstOrDefault<PersonModel>(sql, new { Id = id });
        }

        public List<PersonModel> GetList()
        {
            string sql = "select Id,Name,City from Person";
            return DmConnectionFactory.GetConn().Query<PersonModel>(sql).ToList();
        }

        public int Add(PersonModel model)
        {
            string sql = "insert into Person(Name,City) Values(:Name,:City);Select @@IDENTITY";
            return DmConnectionFactory.GetConn().QuerySingle<int>(sql, model);
        }

        public bool Update(PersonModel model)
        {
            string sql = "update Person set City=:City where Id=:Id";
            int result = DmConnectionFactory.GetConn().Execute(sql, model);
            return result > 0;
        }

        public bool Delete(int id)
        {
            string sql = "delete from Person where Id=:Id";
            int result = DmConnectionFactory.GetConn().Execute(sql, new { Id = id });
            return result > 0;
        }
    }

Query、Execute這些方法都是Dapper定義的,可以看到能夠少寫很多代碼。這裡也不用打開連接、關閉連接,也不用寫using,因為Dapper的這些方法中已經做了相關處理。


好了,以上就是本文的主要內容。如有錯漏歡迎指正。

收穫更多架構知識,請關註微信公眾號 螢火架構。原創內容,轉載請註明出處。
掃描二維碼關註公眾號


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Java 8 之前,介面裡面只能寫抽象方法,不能寫實現方法 Java 8 開始是可以有方法實現的,可以在介面中添加預設方法和靜態方法 預設方法用 default 修飾,只能用在介面中,靜態方法用 static 修飾,並且介面中的預設方法、靜態方法可以同時有多個。 為什麼要用介面預設方法 舉一個很現實 ...
  • 一、環境安裝及配置 引用鏈接:Go語言環境安裝及配置 Go版本安裝 百度網盤msi地址:版本v1.18.1提取碼:m1mc GoLand工具 鏈接:【版本2020.1】提取碼:7x9o 2.1、安裝流程 goland-2020.1.exe安裝 2.2、破解 先下載壓縮包解壓後得到jetbrains- ...
  • 這篇文章我們來介紹一下 super,我相信大部分的人使用 super 都是使用這種方式; # 就是我有一個 class 比如說是 Male,然後繼承另外一個 class 比如是 Person,然後我在這個 Male 也就是它的子類的 init 函數裡面用 super().__init__() 來調用 ...
  • 各種鎖 可重入鎖、公平鎖\非公平鎖、獨占鎖\共用鎖、讀寫鎖 鎖狀態 重量級鎖、輕量級鎖、偏量鎖、鎖膨脹、鎖粗化、鎖自旋\自定義自旋 volatile輕量級鎖,鎖變數,可見性 synchronized使用方式,不同使用方式的底層實現,非公平鎖,鎖升級原理,鎖優化,降級 單例模式與synchronize... ...
  • 1. 概念 1.1 此次編寫字元串的查找和字元串的統計 1.2 編寫字元串常用的方法 1.2.1 string.isspace() 如果string中只包含空格,則返回true 1.2.2 string.isalnum() 如果string至少有一個字元並且所有字元都是字母或者數字則返回true 1 ...
  • 本章將和大家分享ASP.NET Core 中間件(Middleware)的使用及其源碼解析。 ...
  • 緣起 概述:發現現如今網上關於Java、前端、Android、Golang...等相關技術的學習資料,面試指南一搜都是一大把,但是我們大.NET/C#的相關學習資料,面試指南和一些常見的面試題都是寥寥無幾,並不是沒有人寫,而是因為網上的資料和文章太零散了,缺少一個彙總的知識庫。因此作為.NET開發中 ...
  • 描述給定一個單鏈表和數值x,劃分鏈表使得所有小於x的節點排在大於等於x的節點之前。你應該保留兩部分內鏈表節點原有的相對順序。 樣例 1: 輸入: list = null x = 0 輸出: null 解釋: 空鏈表本身滿足要求 樣例 2: 輸入: list = 1->4->3->2->5->2->n ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...