目录
  • 关于 ExecuteNonQuery
  • 数据库脚本程序的执行流程
  • 范例运行环境
  • 通用类的设计
    • 引用
    • DAL类
    • 实现代码
  • 小结

    关于 ExecuteNonQuery

    在.net 应用中,在数据库中执行脚本程序是经常用到的功能,如数据操作(新增、修改、删除等),执行一个存储过程等,实现的核心方法需要执行 Command 对象的ExecuteNonQuery方法。该方法对数据库连接执行 Transact-SQL 语句并返回受影响的行数。

    生成数据集对象需要利用 ADO.NET 中的数据提供者对象包括IDbConnection、IDbCommand、IDbDataParameter等,如何使用这些对象请参考这篇文章:C#实现IDbConnection/IDbCommand等相关通用数据接口_C#教程_ (jb51.net)

    本文将介绍如何通过利用IDbCommand 实现通用数据库脚本执行程序。

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

    首先需要创建连接对象,成功后下达符合对应数据库规范的命令指令,该指令可能包括需要的参数对象(需要定义名称和赋值等操作),通过 IDbCommand 命令接口对象执行,大体流程如下图:

    C#利用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 数据操作类,该类设计如下:

    序号 成员 类型 说明
    1 public string ConnKeyString=""
            
    属性 访问在ConfigurationSettings.AppSettings[ConnKeyString]中存储的数据连接串,该关键字为优先选项,如果为空则访问 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 的更多资料请参考如下链接:CommandType 枚举 (System.Data) | Microsoft Learn

    实现代码

    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;
    		}
     
    }

    小结

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。