当前位置:首页 » 《资源分享》 » 正文

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

14 人参与  2024年05月02日 18:26  分类 : 《资源分享》  评论

点击全文阅读


 

目录

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

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


点击全文阅读


本文链接:http://zhangshiyu.com/post/102975.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1