国产化之 .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;
}
///
/// 执行一条SQL语句,确定记录是否存在
///
/// SQL查询语句
///
public async Task 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;
}
///
/// 执行一条SQL语句,确定记录是否存在
///
/// SQL查询语句
/// SQL参数数组
///
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;
}
///
/// 执行一条SQL语句,确定记录是否存在
///
/// SQL查询语句
/// SQL参数数组
///
public async Task 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;
}
///
/// 获取记录条数
///
/// 表名
/// 查询条件
///
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;
}
}
///
/// 获取记录条数
///
/// 表名
/// 查询条件
///
public async Task 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;
}
}
///
/// 获取记录条数
///
/// 表名
/// 查询条件
/// SQL参数数组
///
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;
}
}
///
/// 获取记录条数
///
/// 表名
/// 查询条件
/// SQL参数数组
///
public async Task 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语句
///
/// 执行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;
}
}
}
///
/// 执行SQL语句,返回影响的记录数
///
/// SQL语句
/// 影响的记录数
public async Task 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;
}
}
}
///
/// 执行SQL语句,返回影响的记录数(可自定义超时时间)
///
/// SQL语句
/// 执行超时时间
/// 影响的记录数
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;
}
}
}
///
/// 执行SQL语句,返回影响的记录数(可自定义超时时间)
///
/// SQL语句
/// 执行超时时间
/// 影响的记录数
public async Task 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;
}
}
}
///
/// 执行多条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;
}
}
}
}
}
///
/// 执行多条SQL语句,实现数据库事务。
///
/// 多条SQL语句
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;
}
}
}
}
}
///
/// 执行一条SQL查询语句,返回查询结果。
///
/// SQL查询语句
/// 查询结果
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;
}
}
}
}
///
/// 执行一条SQL查询语句,返回查询结果。
///
/// SQL查询语句
/// 查询结果
public async Task