C#利用IDbCommand實(shí)現(xiàn)通用數(shù)據(jù)庫腳本執(zhí)行程序
關(guān)于 ExecuteNonQuery
在.net 應(yīng)用中,在數(shù)據(jù)庫中執(zhí)行腳本程序是經(jīng)常用到的功能,如數(shù)據(jù)操作(新增、修改、刪除等),執(zhí)行一個(gè)存儲(chǔ)過程等,實(shí)現(xiàn)的核心方法需要執(zhí)行 Command 對象的ExecuteNonQuery方法。該方法對數(shù)據(jù)庫連接執(zhí)行 Transact-SQL 語句并返回受影響的行數(shù)。
生成數(shù)據(jù)集對象需要利用 ADO.NET 中的數(shù)據(jù)提供者對象包括IDbConnection、IDbCommand、IDbDataParameter等,如何使用這些對象請參考這篇文章:C#實(shí)現(xiàn)IDbConnection/IDbCommand等相關(guān)通用數(shù)據(jù)接口_C#教程_腳本之家 (jb51.net)
本文將介紹如何通過利用IDbCommand 實(shí)現(xiàn)通用數(shù)據(jù)庫腳本執(zhí)行程序。
數(shù)據(jù)庫腳本程序的執(zhí)行流程
首先需要?jiǎng)?chuàng)建連接對象,成功后下達(dá)符合對應(yīng)數(shù)據(jù)庫規(guī)范的命令指令,該指令可能包括需要的參數(shù)對象(需要定義名稱和賦值等操作),通過 IDbCommand 命令接口對象執(zhí)行,大體流程如下圖:

范例運(yùn)行環(huán)境
操作系統(tǒng): Windows Server 2019 DataCenter
.net版本: .netFramework4.7.1 或以上
開發(fā)工具:VS2019 C#
數(shù)據(jù)庫:在這里我們以支持 Oracle 9i、MS SQL Server 2016、國產(chǎn)達(dá)夢數(shù)據(jù) 8 為例
通用類的設(shè)計(jì)
引用
在實(shí)現(xiàn)方法前請引用如下代碼:
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ì)如下:
| 序號 | 成員 | 類型 | 說明 |
|---|---|---|---|
| 1 | public string ConnKeyString="" | 屬性 | 訪問在ConfigurationSettings.AppSettings[ConnKeyString]中存儲(chǔ)的數(shù)據(jù)連接串,該關(guān)鍵字為優(yōu)先選項(xiàng),如果為空則訪問 ConnString 直接連接串 |
| 2 | public string ConnString="" | 屬性 | IdbConnection對象的連接串,該屬性僅到ConnKeyString為空時(shí)試圖訪問 |
| 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ù)庫提供的錯(cuò)誤號 |
| 7 | public void ExecDbScripts(string _sql,ArrayList paras,CommandType ct) | 方法 | ExecDbScripts 方法用于執(zhí)行數(shù)據(jù)庫腳本 |
ExecDbScripts 方法無返回值,均通過設(shè)置 ErrorMessage、RowsCount、ErrorNum屬性實(shí)現(xiàn),其參數(shù)說明見下表:
| 序號 | 參數(shù)名 | 類型 | 說明 |
|---|---|---|---|
| 2 | _sql | string | 要執(zhí)行的SQL語句命令行 |
| 3 | paras | ArrayList | 要賦值的參數(shù)對象,逐個(gè)添加到ArrayList里,請注意參數(shù)為實(shí)體數(shù)據(jù)參數(shù)對象,如 MS SQL Server ,請傳遞如下代碼: ArrayList.Add(new SqlParameter("參數(shù)名",參數(shù)值)); |
| ct | CommandType | System.Data.CommandType 枚舉,可包括: StoredProcedure(存儲(chǔ)過程) |
有關(guān) CommandType 的更多資料請參考如下鏈接: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ù)庫腳本執(zhí)行程序的文章就介紹到這了,更多相關(guān)C# IDbCommand數(shù)據(jù)庫腳本內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#使用Win2D在UWP程序中實(shí)現(xiàn)2D繪圖
這篇文章介紹了C#使用Win2D在UWP程序中實(shí)現(xiàn)2D繪圖的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
使用C#自動(dòng)化生成Excel單元格數(shù)據(jù)驗(yàn)證
在日常報(bào)表開發(fā)中,Excel 的數(shù)據(jù)準(zhǔn)確性和可控性與格式美觀同樣重要,本文將演示如何在 同一個(gè)工作表中 設(shè)置 下拉列表、數(shù)值范圍、日期區(qū)間、文本長度、自定義公式和輸入提示,有需要的小伙伴可以了解下2025-09-09
C#控制臺(tái)基礎(chǔ) list<>初始化的兩種方法
這篇文章主要介紹了C#控制臺(tái)基礎(chǔ) list<>初始化的兩種方法,需要的朋友可以參考下2016-12-12
C#請求http向網(wǎng)頁發(fā)送接收數(shù)據(jù)的方法
這篇文章主要為大家詳細(xì)介紹了C#請求http向網(wǎng)頁發(fā)送數(shù)據(jù)、網(wǎng)頁接收的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
C#使用隨機(jī)數(shù)編寫班級點(diǎn)名器的示例代碼
本文主要介紹了C#使用隨機(jī)數(shù)編寫班級點(diǎn)名器的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
C#使用TimeSpan時(shí)間計(jì)算的簡單實(shí)現(xiàn)
這篇文章主要給大家介紹了關(guān)于C#使用TimeSpan時(shí)間計(jì)算的相關(guān)資料,以及通過一個(gè)實(shí)例代碼給大家介紹了C#使用timespan和timer完成一個(gè)簡單的倒計(jì)時(shí)器的方法,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06

