关于 ExecuteNonQuery
在.net 应用中,在数据库中执行脚本程序是经常用到的功能,如数据操作(新增、修改、删除等),执行一个存储过程等,实现的核心方法需要执行 Command 对象的ExecuteNonQuery方法。该方法对数据库连接执行 Transact-SQL 语句并返回受影响的行数。
生成数据集对象需要利用 ADO.NET 中的数据提供者对象包括IDbConnection、IDbCommand、IDbDataParameter等,如何使用这些对象请参考我的文章:
《C#实现 IDbConnection / IDbCommand 等相关通用数据接口》
本文将介绍如何通过利用IDbCommand 实现通用数据库脚本执行程序。
数据库脚本程序的执行流程
首先需要创建连接对象,成功后下达符合对应数据库规范的命令指令,该指令可能包括需要的参数对象(需要定义名称和赋值等操作),通过 IDbCommand 命令接口对象执行,大体流程如下图:
范例运行环境
操作系统: Windows Server 2019 DataCenter
.net版本: .netFramework4.7.1 或以上
开发工具:VS2019 C#
数据库:在这里我们以支持 Oracle 9i、MS SQL Server 2016、国产达梦数据 8 为例
通用类的设计
引用
在实现方法前请引用如下代码:
代码语言:javascript复制using System.Data;
using System.Data.SqlClient;
using System.Data.OracleClient;
using Dm;
using System.Collections;
DAL类
创建一个 DAL 数据操作类,该类设计如下:
序号 | 成员 | 类型 | 说明 |
---|---|---|---|
1 | public string ConnKeyString="" | 属性 | 访问在ConfigurationSettings.AppSettingsConnKeyString中存储的数据连接串,该关键字为优先选项,如果为空则访问 ConnString 直接连接串 |
2 | public string ConnString="" | 属性 | IdbConnection对象的连接串,该属性仅到ConnKeyString为空时试图访问 |
3 | public string DbServerType="" | 属性 | 目前支持 "oracle"、 "dm8",其它字符串均视为 MS SQL Server |
4 | public string ErrorMessage="" | 属性 | 当执行脚本命令发生错误时捕捉到的错误信息 |
5 | public int RowsCount=0 | 属性 | 当执行脚本命令成功后的影响行数,默认值为0 |
6 | public int ErrorNum=0 | 属性 | 当执行脚本命令失败时,返回数据库提供的错误号 |
7 | public void ExecDbScripts(string _sql,ArrayList paras,CommandType ct) | 方法 | ExecDbScripts 方法用于执行数据库脚本 |
ExecDbScripts 方法无返回值,均通过设置 ErrorMessage、RowsCount、ErrorNum属性实现,其参数说明见下表:
序号 | 参数名 | 类型 | 说明 |
---|---|---|---|
2 | _sql | string | 要执行的SQL语句命令行 |
3 | paras | ArrayList | 要赋值的参数对象,逐个添加到ArrayList里,请注意参数为实体数据参数对象,如 MS SQL Server ,请传递如下代码: ArrayList.Add(new SqlParameter("参数名",参数值)); |
| ct | CommandType | System.Data.CommandType 枚举,可包括: StoredProcedure(存储过程) TableDirect(直接表查询) Text(文本查询)该值为默认值 |
有关 CommandType 的更多资料请参考如下链接:
https://learn.microsoft.com/zh-CN/dotnet/api/system.data.commandtype?view=netcore-3.1
实现代码
DAL类完整的实现代码如下:
代码语言:javascript复制public class CODAL
{
public string ConnKeyString="JaneConnection";
public string ConnString="";
public string DbServerType= ConfigurationSettings.AppSettings["DbServerType"];
public string ErrorMessage="";
public int RowsCount=0;
public int ErrorNum=0;
public void ExecDbScripts(string _sql,ArrayList paras,CommandType ct)
{
string strConn =ConfigurationSettings.AppSettings[ConnKeyString];
if(ConnString!="")
{
strConn=ConnString;
}
System.Data.IDbConnection Conn=GetConnection(DbServerType,strConn);
System.Data.IDbCommand Cmd=GetCommand(DbServerType,_sql,paras,Conn);
Cmd.CommandType=ct;
Cmd.CommandTimeout=CommandTimeOut;
try
{
Conn.Open();
int i=Cmd.ExecuteNonQuery();
RowsCount=i;
}
catch (Exception e)
{
if (e.GetType() ==typeof(System.Data.SqlClient.SqlException))
{
int errnumber = ((System.Data.SqlClient.SqlException)e).Number;
ErrorNum = errnumber;
}else if (e.GetType() == typeof(System.Data.OracleClient.OracleException))
{
int errnumber = ((System.Data.OracleClient.OracleException)e).Code;
ErrorNum = errnumber;
}
else if (e.GetType() == typeof(DmException))
{
int errnumber = ((DmException)e).Number;
ErrorNum = errnumber;
}
ErrorMessage=rv[1];
Cmd.Parameters.Clear();
}
finally
{
if(Conn.State==ConnectionState.Open)
{
Conn.Close();
}
}
}
public System.Data.IDbConnection GetConnection(string DbServerType,string ConnectionString)
{
IDbConnection con = null;
switch (DbServerType.ToLower())
{
case "oracle":
con = new OracleConnection(ConnectionString);break;
case "dm8":
con = new DmConnection(ConnectionString); break;
default:
con = new SqlConnection(ConnectionString); break;
}
return con;
}
public IDbCommand GetCommand(string dbservertype,string cmdText,ArrayList paras,IDbConnection con)
{
IDbCommand cmd = null;
switch (dbservertype.ToLower())
{
case "oracle": cmd = new OracleCommand(cmdText,(OracleConnection)con);
break;
case "dm8":
cmd = new DmCommand(cmdText, (DmConnection)con);
break;
default: cmd = new SqlCommand(cmdText,(SqlConnection)con); break;
}
if(paras!=null)
{
for(int i=0;i<paras.Count;i )
{
cmd.Parameters.Add(GetParameter(dbservertype,paras[i]));
}
}
return cmd;
}
public System.Data.IDbDataParameter GetParameter(string dbservertype,object paras)
{
IDbDataParameter para = null;
switch (dbservertype.ToLower())
{
case "oracle": para =(OracleParameter)paras;
break;
case "dm8":
para = (DmParameter)paras;
break;
default: para =(SqlParameter)paras; break;
}
return para;
}
}
小结
有关更多关于 ExecuteNonQuery 方法的使用请参考如下链接:
https://learn.microsoft.com/zh-cn/dotnet/api/system.data.sqlclient.sqlcommand.executenonquery?view=dotnet-plat-ext-5.0