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

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

关于 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 数据操作类,该类设计如下:

序号 成员 类型 说明
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 的更多资料请参考如下链接:

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

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

相关文章
|
4天前
|
C#
WPF/C#:程序关闭的三种模式
WPF/C#:程序关闭的三种模式
10 3
|
10天前
|
并行计算 算法 C#
C# Mandelbrot和Julia分形图像生成程序更新到2010-9-14版 支持多线程计算 多核处理器
此文档是一个关于分形图像生成器的介绍,作者分享了个人开发的M-J算法集成及色彩创新,包括源代码和历史版本。作者欢迎有兴趣的读者留言交流,并提供了邮箱(delacroix_xu@sina.com)以分享资源。文中还展示了程序的发展历程,如增加了真彩色效果、圈选放大、历史记录等功能,并分享了几幅精美的分形图像。此外,还提到了程序的新特性,如导入ini文件批量输出图像和更新一批图片的功能。文档末尾附有多张程序生成的高分辨率分形图像示例。
|
15天前
|
存储 关系型数据库 MySQL
MySQL数据库——存储过程-条件处理程序(通过SQLSTATE指定具体的状态码,通过SQLSTATE的代码简写方式 NOT FOUND)
MySQL数据库——存储过程-条件处理程序(通过SQLSTATE指定具体的状态码,通过SQLSTATE的代码简写方式 NOT FOUND)
12 0
MySQL数据库——存储过程-条件处理程序(通过SQLSTATE指定具体的状态码,通过SQLSTATE的代码简写方式 NOT FOUND)
|
26天前
|
安全 关系型数据库 数据库连接
用pivotal的数据库连接驱动的时候的程序,ssl的url如何配
【5月更文挑战第23天】用pivotal的数据库连接驱动的时候的程序,ssl的url如何配
35 1
|
1月前
|
Oracle Unix 关系型数据库
AIX数据库启动和停止脚本
AIX数据库启动和停止脚本
19 1
|
29天前
|
测试技术 持续交付 C#
C#程序基础开发入门学习笔记
C#是一种现代的、面向对象的编程语言,广泛应用于Windows应用程序开发、游戏开发(尤其是Unity引擎)、Web应用程序以及跨平台应用等。
34 0
|
1月前
|
SQL 存储 数据库连接
C#SQL Server数据库基本操作(增、删、改、查)
C#SQL Server数据库基本操作(增、删、改、查)
20 0
|
1月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
|
1月前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
|
1月前
|
开发框架 .NET Java
探索 C#编程的奥秘与魅力
【4月更文挑战第20天】C#是微软开发的现代、面向对象的编程语言,以其简洁语法、强大功能和跨平台支持脱颖而出。它支持自动垃圾回收、泛型、委托、LINQ,并广泛应用于桌面、Web、移动和游戏开发。C#拥有活跃的开发者社区和丰富的资源,是Unity游戏开发的首选语言。随着.NET Core,C#可在多个操作系统上运行,持续创新,未来发展潜力巨大。

热门文章

最新文章