五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > 仿Linq to Sql將 SQL 語句轉(zhuǎn)換成參數(shù)化 SQL 語句

仿Linq to Sql將 SQL 語句轉(zhuǎn)換成參數(shù)化 SQL 語句

文章來源:365jz.com     點(diǎn)擊數(shù):738    更新時(shí)間:2009-09-13 10:50   參與評論

使用過linq to sql的都知道LINQ to SQL 可以將查詢轉(zhuǎn)換成參數(shù)化 SQL 查詢(以文本形式),然后將它們發(fā)送至 SQL 服務(wù)器進(jìn)行處理。

例如執(zhí)行一個(gè)insert語句:

QQ截圖未命名

剛開始我以為它是直接把值傳入即可,其實(shí)不然,看一下生成的sql語句就知道了:

 QQ截圖未命名1

很是方便,我們不用自己手動(dòng)設(shè)置SqlParameter參數(shù),只用傳入實(shí)際的值即可,并且這樣參數(shù)化的sql語句也很安全。

但是回想起我平時(shí)使用的直接執(zhí)行sql語句的代碼,其中少不了的一步就是設(shè)置SqlParameter參數(shù),很是煩人,尤其是做insert操作的使用,字段多的話,更是惱火。于是突發(fā)奇想能不能封住一個(gè)方法模仿LINQ to SQL自動(dòng)將的查詢轉(zhuǎn)換成參數(shù)化 SQL 查詢呢?

首先確定方法的簽名

 

public static SqlCommand GetSqlStringCommandAndSetValue(this Database dataBase, string formatSqlString, params object[] parameterValues)

 

這是一個(gè)擴(kuò)展方法而已,沒什么其他特別之處

現(xiàn)在最重要的是怎么轉(zhuǎn)換為參數(shù)化的SQL語句,以及設(shè)置SqlParameter

整合代碼很簡單,也沒有想到好的方法,以至于看起來有些丑陋,不過還是可以使用

public static SqlCommand GetSqlStringCommandAndSetValue(this Database dataBase, string formatSqlString, 
params object[] parameterValues)
{
string[] parameters = new string[parameterValues.Length];
for (int i = 0; i < parameterValues.Length; i++)
{
parameters[i] = "@p" + i.ToString();
}
SqlCommand command = dataBase.GetSqlStringCommand(string.Format(formatSqlString, parameters)) as SqlCommand;

for (int i = 0; i < parameterValues.Length; i++)
{

dataBase.AddInParameter(command, "@p" + i.ToString(),
SqlMetaData.InferFromValue(parameterValues[i], "@p" + i.ToString()).DbType, parameterValues[i]);
}
return command;
}

這個(gè)方法中要注意的一個(gè)方法是就是 SqlMetaData.InferFromValue方法,它可以把System.Type類型轉(zhuǎn)化為SqlDbType,其他也沒有什么高深的地方。

哈哈,有了這個(gè)方法我們就不用一個(gè)一個(gè)的設(shè)置SqlParameter了,只是使用的時(shí)候注意參數(shù)的順序,這點(diǎn)約定好就是了。

看看以前代碼片段:

 

DbCommand command = _db.GetSqlStringCommand("Delete from Question_Marked where UserID=@CurrUserID and QID=@QID");
_db.AddInParameter(command, "@QID", qID);
_db.AddInParameter(command, "@CurrUserID", currUserID);

 

再來看看有個(gè)上面的方法之后的代碼片段吧:

DbCommand command = _db.GetSqlStringCommandAndSetValue(@"Delete from Question_Marked where UserID={0} and QID={1}", currUserID, qID);

 

是不是和Linq to Sql 中執(zhí)行sql語句看起來一樣了,使用也方便了,實(shí)質(zhì)上也參數(shù)化了Sql語句。

Tag標(biāo)簽: asp.net,參數(shù)化sql

如對本文有疑問,請?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會為你解答?。?點(diǎn)擊進(jìn)入論壇

發(fā)表評論 (738人查看,0條評論)
請自覺遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動(dòng)的言論。
昵稱:
最新評論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學(xué)習(xí)

業(yè)務(wù)咨詢

· 技術(shù)支持
· 服務(wù)時(shí)間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權(quán)所有 鄂ICP備17013400號