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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/4499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言趣味代码(四)

这一篇主要编写几个打字练习的小程序&#xff0c;然后通过这些小程序的实现来回顾复习我们之前学过的知识&#xff0c;然后通过这写打字练习的小程序来提升我们的打字技术和编程技术。 1. 打字练习 1.1 基本打字练习 1.1.1 基本实现 首先我们来制作一个用于计算并显示输入一…

github two-factor authentication是个啥?

最近在逛github时&#xff0c;总是时不时会弹出一下界面&#xff0c;很烦 看到红框里的文字&#xff0c;这明显是强制要求做这个认证&#xff0c;如果不认证4天后账号将不可访问&#xff0c;所以今天花点时间看看怎么做这个认证&#xff0c;点“Enable 2FA now”进入这个界面&a…

普通用户执行source报错,sudo: source:找不到命令的解决方案

一、问题描述 当修改/etc/profile文件&#xff08;环境变量&#xff09;后&#xff0c;想让该环境变量立刻生效。需要执行source命令。命令如下&#xff1a; sudo source /etc/profile 执行这个后&#xff0c;不像别人的执行成功&#xff0c;反而报错了。错误信息如下&#…

linux下安装anaconda

顺手点个关注吧&#xff0c;谢谢&#xff01; 一、下载安装包 https://repo.anaconda.com/archive/ 或者使用命令 wget https://repo.anaconda.com/archive/Anaconda3-5.3.1-Linux-x86_64.sh2.赋予权限并安装 # 给文件执行权限 chmod 777 Anaconda3-5.3.1-Linux-x86_64.sh# 执…

商汤研究院招大模型实习生

商汤研究院招大模型实习生&#xff0c;base上海、北京&#xff0c;400/day。福利&#xff1a;每天50租房补贴&#xff0c;20的餐补。晚上8点之后回去有额外的25元晚餐餐补&#xff0c;10点之后回去可以免费用滴滴。 组内的大模型工作大概分两个方向&#xff1a; 1.3B、3B等小…

基于opencv的单目相机标定

openCv版本&#xff1a;4.4.0 从源码处拷贝标定代码出来使用&#xff0c;需要拷贝samples/cpp/tutorial_code/calib3d/camera_calibration 需要的文件如下&#xff1a; -rw-rw-r-- 1 rog rog 28490 Jul 18 2020 camera_calibration.cpp -rw-rw-r-- 1 rog rog 3152 Jul 18 …

判断前端入参是否空否则提示前端写法

vue2中 前端先声明一个变量&#xff0c;用于alert判断 在templeat中定义一个提示语句 然后在点击事件时判断一下是否展示

【Linux】NFS网络文件系统搭建

一、服务端配置 #软件包安装 [roothadoop01 ~]# yum install rpcbind nfs-utils.x86_64 -y [roothadoop01 ~]# mkdir /share#配置文件修改 #格式为 共享资源路径 [主机地址] [选项] # [roothadoop01 ~]# vi /etc/exports /share 192.168.10.0/24(rw,sync,no_root_squash) #…

python数据可视化:集中趋势统计堆叠柱状图barplot()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 python数据可视化&#xff1a; 集中趋势统计 堆叠柱状图 barplot() [太阳]选择题 请问关于以下代码表述错误的选项是&#xff1f; import seaborn as sns import matplotlib.pyplot as plt im…

cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library

pip install cx_Oracleimport cx_Oracle 再导入该模块进行数据库连接的时候报错 这个错误表明您的Python环境是64位的&#xff0c;但是您尝试使用的Oracle客户端库&#xff08;oci.dll&#xff09;是32位的 根据官方给出的文档进行查看 cx_Oracle 8 Installation — cx_Ora…

Rancher 应用商店离线环境使用

前言 Rancher (v2.5 ) 应用商店可以方便的安装 Helm3 构建的应用&#xff0c;并且支持私有 helm 应用仓库&#xff0c;方便了内网离线环境下的使用。本文以内网离线环境为前提、以 MySQL 5.7.43 版本为应用举例&#xff0c;从零开始手把手教你如何制作并应用。 1、环境准备 1.…

Leetcode—1017. 负二进制转换【中等】(string列表初始化、反向迭代器)

2024每日刷题&#xff08;120&#xff09; Leetcode—1017. 负二进制转换 实现代码 class Solution { public:string baseNeg2(int n) {string ans;while(n ! 0) {ans to_string(n & 1);n -(n >> 1);}return ans.empty() ? "0": string{ans.rbegin(),…

Axure RP 9中文激活版:专业原型设计工具mac/win

Axure RP 9是一款由美国Axure Software Solution公司开发的专业原型设计工具。它凭借强大的交互功能和丰富的设计素材&#xff0c;为产品经理、UI设计师、交互设计师等用户提供了高效、便捷的原型设计体验。 Axure RP 9支持快速创建线框图、流程图、原型和规格说明文档&#xf…

03-JAVA设计模式-模板方法模式

模板方法模式 什么是模板方法 模板方法模式&#xff08;Template Method Pattern&#xff09;在Java中是一种行为型设计模式&#xff0c;它定义了一个操作中的算法骨架&#xff0c;而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某…

AI文章写作网站

最强AI文章写作网站——心语流光&#xff08; Super Ai Writer &#xff09; 特点 多轮问答写作&#xff0c;自动携带历史记录进行问答可以自定义携带历史记录的轮数&#xff0c;为0则携带全部历史记录&#xff0c;有效避免token浪费&#xff08;类似coze平台&#xff09;AI生…

线上社交app的搭建,圈子社交系统,小程序+app+H5三端,源码交付,支持二开!

在科技飞速发展的大背景下&#xff0c;年轻人社交不再局限于面对面&#xff0c;线上社交app已深入各大年轻人的手机中。相比于传统交友方式&#xff0c;线上社交app为用户提供了更加新奇的交友体验。同时&#xff0c;它还可以吸引更多的朋友&#xff0c;提高用户的整体交友体验…

54.基于SpringBoot + Vue实现的前后端分离-外卖点餐系统(项目 + 论文PPT)

项目介绍 本站是一个B/S模式系统&#xff0c;采用SpringBoot Vue框架&#xff0c;MYSQL数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得基于SpringBoot Vue技术的外卖点餐系统设计与实现管理工作系统…

一文带你了解MySQL的约束

文章目录 ☃️概述☃️分类☃️常用约束☃️外键约束❄️❄️外键删除/更新行为 欢迎来到 请回答1024 的博客 &#x1f34e;&#x1f34e;&#x1f34e;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与空间的平…

怎么在海外平台买东西?Nike海淘攻略

不管在那个海外平台买东西首先要进入官网&#xff0c;最好注册一个gmail账号&#xff0c;这样使用范围比较宽广&#xff0c;在对应平台进行注册账号&#xff0c;比如亚马逊、ebay、Etsy等等 一、Nike海淘攻略 1、然后如果已经会员的话直接输入账号密码登录&#xff0c;如果不…

02 面向切面编程(AOP)核心概念:Aspect

02 面向切面编程&#xff08;AOP&#xff09;核心概念&#xff1a;Aspect 一 定义二 构成要素1. Advice&#xff08;通知&#xff09;2. Pointcut&#xff08;切点&#xff09;3. Join Point&#xff08;连接点&#xff09; 三 织入&#xff08;Weaving&#xff09;四 样例代码…