背景

某个我的项目须要实现根底软件全副国产化,其中操作系统指定河汉麒麟,数据库应用达梦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_1...

下载前须要先登录,轻易注册一个帐号就好了。

这里须要抉择CPU和操作系统,依照你的开发环境抉择即可,下载后依照提醒装置。

这里以Windows10为例,装置后SDK文件的地位在:C:\dmdbms\drivers\dotNet

这里边有EF的SDK,也有NHibernate的SDK,不过这篇文章只应用最根底的基于ADO.NET的SDK。

这些SDK在文件夹DmProvider下边,这里还提供了一个Nuget包,能够放到本人的Nuget仓库中,不便外部装置。

能够看到,这个SDK能够反对.NET Core2.0以上的所有.NET版本。

操作数据库

这里提供两种形式:传统的DbHelperSQL形式 和 Dapper 形式。

DbHelperSQL形式

这种形式早年用的比拟多,当初还有很多我的项目在应用,通过定义一组工具办法包装对数据库的各种增删改查操作。上面给出代码:

    public class DmDbHelper    {        private string connectionString = string.Empty;        /// <summary>        /// 初始化DMClient的一个新实例        /// </summary>        /// <param name="str"></param>        public DmDbHelper(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的这些办法中曾经做了相干解决。


好了,以上就是本文的次要内容。如有错漏欢送斧正。

播种更多架构常识,请关注微信公众号 萤火架构。原创内容,转载请注明出处。