主頁(yè) > 知識(shí)庫(kù) > 編程經(jīng)驗(yàn)點(diǎn)滴 動(dòng)態(tài)SQL的拼接技巧

編程經(jīng)驗(yàn)點(diǎn)滴 動(dòng)態(tài)SQL的拼接技巧

熱門標(biāo)簽:南京電銷外呼系統(tǒng)運(yùn)營(yíng)商 溫州語(yǔ)音外呼系統(tǒng)代理 西安青牛防封電銷卡 北京辦理400電話多少 威海智能語(yǔ)音外呼系統(tǒng) 400電話申請(qǐng)需要開(kāi)戶費(fèi)嗎 重慶防封電銷機(jī)器人供應(yīng)商 山西語(yǔ)音外呼系統(tǒng)價(jià)格 智能語(yǔ)音外呼系統(tǒng)哪個(gè)牌子好
常見(jiàn)的誤解有:
1. 只用 ado.net ,無(wú)法進(jìn)行動(dòng)態(tài) SQL 拼接。
2. 有幾個(gè)動(dòng)態(tài)參數(shù),代碼的重復(fù)量就成了這些參數(shù)的不同數(shù)量的組合數(shù),動(dòng)態(tài)參數(shù)越多,重復(fù)量越大。

對(duì)于第二個(gè)問(wèn)題,以下的錯(cuò)誤代碼為其證據(jù):
復(fù)制代碼 代碼如下:

if(id>0 string.IsNullOrEmpty(name))
{
command.CommandText = "select * from t1 where id=?";
command.Parameters.Add(id);
}
if(id=0 !string.IsNullOrEmpty(name))
{
command.CommandText = "select * from t1 where name=?";
command.Parameters.Add(name);
}
if(id=0 !string.IsNullOrEmpty(name))
{
command.CommandText = "select * from t1 where id=? and name=?";
command.Parameters.Add(id);
command.Parameters.Add(name);
}

這兩個(gè)問(wèn)題都很好解決,給一個(gè)正確的代碼例子大家看看即可:
復(fù)制代碼 代碼如下:

string sql ="select * from t1 where 1=1";
if(id != null)
{
sql += " and id=?";
addParameterValue(cmd,id);
}
if(!string.IsNullOrEmpty(name))
{
sql += " and name=?";
addParameterValue(cmd,name);
}
command.CommandText = sql;

這里的技巧在于,使用了一個(gè) "where 1=1", 巧妙解決了后續(xù) sql 拼接中,每行開(kāi)頭是否要有 "and" 的問(wèn)題。而這個(gè) "where 1=1",并不會(huì)對(duì)數(shù)據(jù)庫(kù)的索引執(zhí)行,造成性能上的影響。

對(duì)參數(shù)進(jìn)行排列組合,然后寫各種組合的 SQL,這個(gè)思路很奇怪。問(wèn)題是,很多初學(xué)者,都有這個(gè)思維習(xí)慣。本人不是計(jì)算機(jī)科班出身,不知道是否哪本教科書,就是如此教導(dǎo)的。但很不幸的是,這個(gè)思維習(xí)慣是錯(cuò)誤的。

"where 1=1" 雖是教科書中沒(méi)有的小技巧,卻很管用。


另外,在程序中,一般會(huì)在用戶界面上讓使用用戶錄入數(shù)字,這個(gè)數(shù)字的數(shù)值,在代碼中會(huì)自動(dòng)變成 string,然后嘗試 string 轉(zhuǎn)換成 int/long,最后送到 sql 函數(shù)里。這里需要特別注意的是,很多人把某個(gè)特殊的數(shù)值,作為“用戶無(wú)錄入的默認(rèn)值”,正如本文開(kāi)頭所寫的錯(cuò)誤代碼那樣:

復(fù)制代碼 代碼如下:

if(id>0 string.IsNullOrEmpty(name))


問(wèn)題在于,0 是否是不正常的業(yè)務(wù)數(shù)值,代碼中看不出來(lái)。不排除程序員隨意指定一個(gè)數(shù)值,作為“用戶無(wú)錄入的默認(rèn)值”,如果不巧這個(gè)默認(rèn)值,實(shí)際上是有其他意義的,那就造成問(wèn)題。

在數(shù)據(jù)庫(kù)的理論中,沒(méi)有指定的數(shù)據(jù),是用 null 來(lái)表示的,不論是 string 還是 int/long。

這是一個(gè)很好的思路,同樣可以用在這里的 sql 拼接中。因此,我們?cè)诤竺娴拇a中,使用了這個(gè):
復(fù)制代碼 代碼如下:

if(id != null)

上述代碼中,

addParameterValue(cmd,name); 是一個(gè)簡(jiǎn)單封裝的函數(shù),用來(lái)封裝如下一小段代碼,目的是讓最后的代碼,較為簡(jiǎn)捷直觀:
復(fù)制代碼 代碼如下:

DbParameter p = cmd.CreateParameter();
p.ParameterName = "@XXX";
p.Value = TTT;
cmd.Parameters.Add(p);

當(dāng)然,這個(gè) addParameterValue() 封裝函數(shù),是可有可無(wú)的。多寫幾個(gè) DbParameter p = cmd.CreateParameter() 并沒(méi)有什么大問(wèn)題。
您可能感興趣的文章:
  • 基于Oracle的高性能動(dòng)態(tài)SQL程序開(kāi)發(fā)
  • 為什么ASP中執(zhí)行動(dòng)態(tài)SQL總報(bào)錯(cuò)誤信息?提示語(yǔ)句語(yǔ)法錯(cuò)誤
  • 批處理 動(dòng)態(tài)sql
  • 動(dòng)態(tài)SQL語(yǔ)句使用心得
  • sqlserver 支持定位當(dāng)前頁(yè),自定義排序的分頁(yè)SQL(拒絕動(dòng)態(tài)SQL)
  • oracle中動(dòng)態(tài)SQL使用詳細(xì)介紹
  • mysql存儲(chǔ)過(guò)程 在動(dòng)態(tài)SQL內(nèi)獲取返回值的方法詳解
  • MySQL 存儲(chǔ)過(guò)程中執(zhí)行動(dòng)態(tài)SQL語(yǔ)句的方法
  • mybatis的動(dòng)態(tài)sql詳解(精)

標(biāo)簽:黃山 金昌 濟(jì)寧 中衛(wèi) 新余 河源 宜春 貸款群呼

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《編程經(jīng)驗(yàn)點(diǎn)滴 動(dòng)態(tài)SQL的拼接技巧》,本文關(guān)鍵詞  編程,經(jīng)驗(yàn),點(diǎn)滴,動(dòng)態(tài),SQL,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《編程經(jīng)驗(yàn)點(diǎn)滴 動(dòng)態(tài)SQL的拼接技巧》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于編程經(jīng)驗(yàn)點(diǎn)滴 動(dòng)態(tài)SQL的拼接技巧的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章