C#利用IDbCommand实现通用数据库脚本执行程序

 

目录

关于 ExecuteNonQuery

数据库脚本程序的执行流程

范例运行环境

通用类的设计

引用

DAL类

实现代码

小结


关于 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 为例

通用类的设计

引用

在实现方法前请引用如下代码:

using System.Data;
using System.Data.SqlClient;
using System.Data.OracleClient;
using Dm;
using System.Collections;

DAL类

创建一个 DAL 数据操作类,该类设计如下:

序号成员类型说明
1public string ConnKeyString=""
        
属性访问在ConfigurationSettings.AppSettings[ConnKeyString]中存储的数据连接串,该关键字为优先选项,如果为空则访问 ConnString 直接连接串
2public string ConnString=""属性IdbConnection对象的连接串,该属性仅到ConnKeyString为空时试图访问
3public string DbServerType=""
       
属性目前支持 "oracle"、 "dm8",其它字符串均视为 MS SQL Server
4public string ErrorMessage=""
        
        
        
属性当执行脚本命令发生错误时捕捉到的错误信息
5public int RowsCount=0属性当执行脚本命令成功后的影响行数,默认值为0
6public int ErrorNum=0属性当执行脚本命令失败时,返回数据库提供的错误号
7public void ExecDbScripts(string _sql,ArrayList paras,CommandType ct)方法ExecDbScripts 方法用于执行数据库脚本

ExecDbScripts 方法无返回值,均通过设置 ErrorMessage、RowsCount、ErrorNum属性实现,其参数说明见下表:

序号参数名类型说明
2_sqlstring要执行的SQL语句命令行
3parasArrayList

要赋值的参数对象,逐个添加到ArrayList里,请注意参数为实体数据参数对象,如 MS SQL Server ,请传递如下代码:

ArrayList.Add(new SqlParameter("参数名",参数值)); 

ctCommandType

System.Data.CommandType 枚举,可包括:

StoredProcedure(存储过程)
TableDirect(直接表查询)
Text(文本查询)该值为默认值

有关 CommandType 的更多资料请参考如下链接:

https://learn.microsoft.com/zh-CN/dotnet/api/system.data.commandtype?view=netcore-3.1

实现代码

DAL类完整的实现代码如下:

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

感谢您的阅读,希望本文能够对您有所帮助。

  • 47
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 23
    评论
以下是一个简单的C#数据库连接池的封装示例: ```csharp using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; namespace ConnectionPoolDemo { public class ConnectionPool { private readonly string _connectionString; private readonly Stack<IDbConnection> _pool; public ConnectionPool(string connectionString, int poolSize) { _connectionString = connectionString; _pool = new Stack<IDbConnection>(poolSize); for (int i = 0; i < poolSize; i++) { IDbConnection connection = new SqlConnection(_connectionString); connection.Open(); _pool.Push(connection); } } public IDbConnection GetConnection() { if (_pool.Count > 0) { return _pool.Pop(); } else { IDbConnection connection = new SqlConnection(_connectionString); connection.Open(); return connection; } } public void ReleaseConnection(IDbConnection connection) { if (connection != null) { _pool.Push(connection); } } } public class DataAccess { private readonly ConnectionPool _connectionPool; public DataAccess(string connectionString, int poolSize) { _connectionPool = new ConnectionPool(connectionString, poolSize); } public void ExecuteNonQuery(string commandText, IDictionary<string, object> parameters) { using (IDbConnection connection = _connectionPool.GetConnection()) { using (IDbCommand command = connection.CreateCommand()) { command.CommandText = commandText; foreach (KeyValuePair<string, object> parameter in parameters) { IDbDataParameter dataParameter = command.CreateParameter(); dataParameter.ParameterName = parameter.Key; dataParameter.Value = parameter.Value; command.Parameters.Add(dataParameter); } command.ExecuteNonQuery(); } } } public object ExecuteScalar(string commandText, IDictionary<string, object> parameters) { using (IDbConnection connection = _connectionPool.GetConnection()) { using (IDbCommand command = connection.CreateCommand()) { command.CommandText = commandText; foreach (KeyValuePair<string, object> parameter in parameters) { IDbDataParameter dataParameter = command.CreateParameter(); dataParameter.ParameterName = parameter.Key; dataParameter.Value = parameter.Value; command.Parameters.Add(dataParameter); } return command.ExecuteScalar(); } } } public DataTable ExecuteDataTable(string commandText, IDictionary<string, object> parameters) { using (IDbConnection connection = _connectionPool.GetConnection()) { using (IDbCommand command = connection.CreateCommand()) { command.CommandText = commandText; foreach (KeyValuePair<string, object> parameter in parameters) { IDbDataParameter dataParameter = command.CreateParameter(); dataParameter.ParameterName = parameter.Key; dataParameter.Value = parameter.Value; command.Parameters.Add(dataParameter); } using (IDataReader reader = command.ExecuteReader()) { DataTable dataTable = new DataTable(); dataTable.Load(reader); return dataTable; } } } } } } ``` 使用示例: ```csharp using System; using System.Collections.Generic; using System.Data; namespace ConnectionPoolDemo { class Program { static void Main(string[] args) { string connectionString = "Data Source=(local);Initial Catalog=TestDB;Integrated Security=True"; int poolSize = 10; DataAccess dataAccess = new DataAccess(connectionString, poolSize); // 执行查询 string query = "SELECT * FROM Users WHERE Age > @age"; IDictionary<string, object> parameters = new Dictionary<string, object>(); parameters.Add("@age", 18); DataTable dataTable = dataAccess.ExecuteDataTable(query, parameters); foreach (DataRow row in dataTable.Rows) { Console.WriteLine("{0} - {1}", row["Name"], row["Age"]); } // 执行插入 string insert = "INSERT INTO Users (Name, Age) VALUES (@name, @age)"; parameters = new Dictionary<string, object>(); parameters.Add("@name", "Tom"); parameters.Add("@age", 20); dataAccess.ExecuteNonQuery(insert, parameters); // 执行更新 string update = "UPDATE Users SET Age = @age WHERE Name = @name"; parameters = new Dictionary<string, object>(); parameters.Add("@name", "Tom"); parameters.Add("@age", 21); dataAccess.ExecuteNonQuery(update, parameters); // 执行删除 string delete = "DELETE FROM Users WHERE Name = @name"; parameters = new Dictionary<string, object>(); parameters.Add("@name", "Tom"); dataAccess.ExecuteNonQuery(delete, parameters); // 释放连接 IDbConnection connection = dataAccess.GetConnection(); dataAccess.ReleaseConnection(connection); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

初九之潜龙勿用

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值