C#利用IDbCommand實(shí)現(xiàn)通用數(shù)據(jù)庫(kù)腳本執(zhí)行程序
關(guān)于 ExecuteNonQuery
在.net 應(yīng)用中,在數(shù)據(jù)庫(kù)中執(zhí)行腳本程序是經(jīng)常用到的功能,如數(shù)據(jù)操作(新增、修改、刪除等),執(zhí)行一個(gè)存儲(chǔ)過(guò)程等,實(shí)現(xiàn)的核心方法需要執(zhí)行 Command 對(duì)象的ExecuteNonQuery方法。該方法對(duì)數(shù)據(jù)庫(kù)連接執(zhí)行 Transact-SQL 語(yǔ)句并返回受影響的行數(shù)。
生成數(shù)據(jù)集對(duì)象需要利用 ADO.NET 中的數(shù)據(jù)提供者對(duì)象包括IDbConnection、IDbCommand、IDbDataParameter等,如何使用這些對(duì)象請(qǐng)參考這篇文章:C#實(shí)現(xiàn)IDbConnection/IDbCommand等相關(guān)通用數(shù)據(jù)接口_C#教程_腳本之家 (jb51.net)
本文將介紹如何通過(guò)利用IDbCommand 實(shí)現(xiàn)通用數(shù)據(jù)庫(kù)腳本執(zhí)行程序。
數(shù)據(jù)庫(kù)腳本程序的執(zhí)行流程
首先需要?jiǎng)?chuàng)建連接對(duì)象,成功后下達(dá)符合對(duì)應(yīng)數(shù)據(jù)庫(kù)規(guī)范的命令指令,該指令可能包括需要的參數(shù)對(duì)象(需要定義名稱和賦值等操作),通過(guò) IDbCommand 命令接口對(duì)象執(zhí)行,大體流程如下圖:
范例運(yùn)行環(huán)境
操作系統(tǒng): Windows Server 2019 DataCenter
.net版本: .netFramework4.7.1 或以上
開發(fā)工具:VS2019 C#
數(shù)據(jù)庫(kù):在這里我們以支持 Oracle 9i、MS SQL Server 2016、國(guó)產(chǎn)達(dá)夢(mèng)數(shù)據(jù) 8 為例
通用類的設(shè)計(jì)
引用
在實(shí)現(xiàn)方法前請(qǐng)引用如下代碼:
using System.Data; using System.Data.SqlClient; using System.Data.OracleClient; using Dm; using System.Collections;
DAL類
創(chuàng)建一個(gè) DAL 數(shù)據(jù)操作類,該類設(shè)計(jì)如下:
序號(hào) | 成員 | 類型 | 說(shuō)明 |
---|---|---|---|
1 | public string ConnKeyString="" | 屬性 | 訪問(wèn)在ConfigurationSettings.AppSettings[ConnKeyString]中存儲(chǔ)的數(shù)據(jù)連接串,該關(guān)鍵字為優(yōu)先選項(xiàng),如果為空則訪問(wèn) ConnString 直接連接串 |
2 | public string ConnString="" | 屬性 | IdbConnection對(duì)象的連接串,該屬性僅到ConnKeyString為空時(shí)試圖訪問(wèn) |
3 | public string DbServerType="" | 屬性 | 目前支持 "oracle"、 "dm8",其它字符串均視為 MS SQL Server |
4 | public string ErrorMessage="" | 屬性 | 當(dāng)執(zhí)行腳本命令發(fā)生錯(cuò)誤時(shí)捕捉到的錯(cuò)誤信息 |
5 | public int RowsCount=0 | 屬性 | 當(dāng)執(zhí)行腳本命令成功后的影響行數(shù),默認(rèn)值為0 |
6 | public int ErrorNum=0 | 屬性 | 當(dāng)執(zhí)行腳本命令失敗時(shí),返回?cái)?shù)據(jù)庫(kù)提供的錯(cuò)誤號(hào) |
7 | public void ExecDbScripts(string _sql,ArrayList paras,CommandType ct) | 方法 | ExecDbScripts 方法用于執(zhí)行數(shù)據(jù)庫(kù)腳本 |
ExecDbScripts 方法無(wú)返回值,均通過(guò)設(shè)置 ErrorMessage、RowsCount、ErrorNum屬性實(shí)現(xiàn),其參數(shù)說(shuō)明見下表:
序號(hào) | 參數(shù)名 | 類型 | 說(shuō)明 |
---|---|---|---|
2 | _sql | string | 要執(zhí)行的SQL語(yǔ)句命令行 |
3 | paras | ArrayList | 要賦值的參數(shù)對(duì)象,逐個(gè)添加到ArrayList里,請(qǐng)注意參數(shù)為實(shí)體數(shù)據(jù)參數(shù)對(duì)象,如 MS SQL Server ,請(qǐng)傳遞如下代碼: ArrayList.Add(new SqlParameter("參數(shù)名",參數(shù)值)); |
ct | CommandType | System.Data.CommandType 枚舉,可包括: StoredProcedure(存儲(chǔ)過(guò)程) |
有關(guān) CommandType 的更多資料請(qǐng)參考如下鏈接:CommandType 枚舉 (System.Data) | Microsoft Learn
實(shí)現(xiàn)代碼
DAL類完整的實(shí)現(xiàn)代碼如下:
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; } }
小結(jié)
到此這篇關(guān)于C#利用IDbCommand實(shí)現(xiàn)通用數(shù)據(jù)庫(kù)腳本執(zhí)行程序的文章就介紹到這了,更多相關(guān)C# IDbCommand數(shù)據(jù)庫(kù)腳本內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c#使用filesystemwatcher監(jiān)視文件系統(tǒng)的變化
對(duì)于一個(gè)文件夾的改變,C#這邊有自己的類來(lái)實(shí)現(xiàn),我們不需要關(guān)心它的內(nèi)部實(shí)現(xiàn)機(jī)制,不需要關(guān)心它底層調(diào)用哪些API,我們只需要關(guān)心如何去調(diào)用它,如何讓它幫助我們記錄文件夾的修改情況即可,下面我們就實(shí)現(xiàn)它2014-01-01C#實(shí)現(xiàn)JSON解析器MojoUnityJson功能(簡(jiǎn)單且高效)
MojoUnityJson 是使用C#實(shí)現(xiàn)的JSON解析器 ,算法思路來(lái)自于游戲引擎Mojoc的C語(yǔ)言實(shí)現(xiàn) Json.h。這篇文章主要介紹了C#實(shí)現(xiàn)JSON解析器MojoUnityJson的方法,需要的朋友可以參考下2018-01-01C#使用DeflateStream解壓縮數(shù)據(jù)文件的方法
這篇文章主要介紹了C#使用DeflateStream解壓縮數(shù)據(jù)文件的方法,較為詳細(xì)的分析了DeflateStream方法對(duì)文件進(jìn)行壓縮及解壓縮的步驟與技巧,需要的朋友可以參考下2015-04-04C#開發(fā)Winform實(shí)現(xiàn)文件操作案例
這篇文章介紹了C#開發(fā)Winform實(shí)現(xiàn)文件操作的案例,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04C#中實(shí)現(xiàn)一次執(zhí)行多條帶GO的sql語(yǔ)句實(shí)例
這篇文章主要介紹了C#中實(shí)現(xiàn)一次執(zhí)行多條帶GO的sql語(yǔ)句,以實(shí)例形式較為詳細(xì)的分析了C#執(zhí)行sql語(yǔ)句的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09C#實(shí)現(xiàn)啟動(dòng)項(xiàng)管理的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)啟動(dòng)項(xiàng)管理,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以了解一下2022-12-12詳解C#中的定時(shí)器Timer類及其垃圾回收機(jī)制
這篇文章主要介紹了C#中的定時(shí)器Timer類及其垃圾回收機(jī)制,講解了Timer相關(guān)的單線程異步工作,需要的朋友可以參考下2016-04-04C#中GraphicsPath的Widen方法用法實(shí)例
這篇文章主要介紹了C#中GraphicsPath的Widen方法用法,實(shí)例分析了Widen方法的使用技巧,需要的朋友可以參考下2015-06-06