• 国产化之 .NET Core 操作达梦数据库DM8的两种方式


    背景

    某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟,数据库使用达梦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的这些方法中已经做了相关处理。


    好了,以上就是本文的主要内容。如有错漏欢迎指正。

    收获更多架构知识,请关注微信公众号 萤火架构。原创内容,转载请注明出处。
    扫描二维码关注公众号

  • 相关阅读:
    擎创技术流 | ClickHouse实用工具—ckman教程(4)
    【矩阵论】4. 矩阵运算——广义逆——加号逆应用
    JAVA-中国矿业大学作业-计算阶乘毫秒时间
    SpringMVC如何转发及重定向(forward、redirect)
    新库上线 | CnOpenData中国审计年鉴数据
    Matlab中的功率谱分析方法与实例分析
    中级程序员——vue3+js+git面试题
    基于LS-SVM对偶问题的分类、回归、时间序列预测和无监督学习研究(Matlab代码实现)
    每日一练:LeeCode-56、合并区间【数组+滑动窗口】
    强化学习输入数据归一化(标准化)
  • 原文地址:https://www.cnblogs.com/bossma/p/16163640.html