您现在的位置是:网站首页> 编程资料编程资料
国产化中的 .NET Core 操作达梦数据库DM8的两种方式(操作详解)_实用技巧_
2023-05-24
419人已围观
简介 国产化中的 .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和操作系统,按照你的开发环境选择即可,下载后按照提示安装。

这里以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 DmDbClient { private string connectionString = string.Empty; /// /// 初始化DMClient的一个新实例 /// /// public DmDbClient(string str) { connectionString = str; } #region 通用快捷方法 /// 执行一条SQL语句,确定记录是否存在 /// SQL查询语句 /// 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; public async Task ExistsAsync(string sql) object obj = await GetSingleAsync(sql); /// SQL参数数组 public bool Exists(string sql, params DmParameter[] paras) object obj = GetSingle(sql, paras); if ((object.Equals(obj, null)) || (object.Equals(obj, DBNull.Value))) public async Task ExistsAsync(string sql, params DmParameter[] paras) object obj = await GetSingleAsync(sql, paras); /// 获取记录条数 /// 表名 /// 查询条件 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); return 0; public async Task GetCountAsync(string tableName, string sqlCondition) object result = await GetSingleAsync(sql); public int GetCount(string tableName, string sqlCondition, DmParameter[] paras) object result = GetSingle(sql, paras); public async Task GetCountAsync(string tableName, string sqlCondition, DmParameter[] paras) object result = await GetSingleAsync(sql, paras); #endregion 通用快捷方法 #region 执行简单SQL语句 /// 执行SQL语句,返回影响的记录数 /// SQL语句 /// 影响的记录数 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; } public async Task ExecuteSqlAsync(string sql) await connection.OpenAsync(); int rows = await cmd.ExecuteNonQueryAsync(); /// 执行SQL语句,返回影响的记录数(可自定义超时时间) /// 执行超时时间 public int ExecuteSqlByTime(string sql, int timeout) using (DmConnection connection = new DmConnection(this.connectionString)) cmd.CommandTimeout = timeout; public async Task ExecuteSqlByTimeAsync(string sql, int timeout) /// 执行多条SQL语句,实现数据库事务。 /// 多条SQL语句 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; } public async Task ExecuteSqlTransAsync(ArrayList sqlList) await conn.OpenAsync(); using (DbTransaction trans = await conn.BeginTransactionAsync()) await cmd.ExecuteNonQueryAsync(); /// 执行一条SQL查询语句,返回查询结果。 /// 查询结果 public object GetSingle(string sql) object obj = cmd.ExecuteScalar(); if ((object.Equals(obj, null)) || (object.Equals(obj, DBNull.Value))) return null; else return obj; public async Task 使用方法也很简单,传入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.Execu
相关内容
- 一文轻松了解ASP.NET与ASP.NET Core多环境配置对比_实用技巧_
- 关于Swagger优化的实战记录_实用技巧_
- ASP.NET Core 6.0 添加 JWT 认证和授权功能_实用技巧_
- .Net Core解决WebAPI中返回时间格式带T的问题_实用技巧_
- ASP.NET MVC使用区域(Area)功能_基础应用_
- .NET Core单元测试的两种方法介绍_实用技巧_
- ASP.NET Core之Web API介绍_基础应用_
- ASP.NET Core MVC中的控制器(Controller)介绍_基础应用_
- ASP.NET Core MVC控制器请求依赖注入_实用技巧_
- ASP.NET Core MVC在视图中使用依赖注入_实用技巧_
点击排行
本栏推荐
