国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > SQL Server > 正文

編程經(jīng)驗點滴 動態(tài)SQL的拼接技巧

2024-08-31 00:57:07
字體:
來源:轉載
供稿:網(wǎng)友
常見的誤解有:
1. 只用 ado.net ,無法進行動態(tài) SQL 拼接。
2. 有幾個動態(tài)參數(shù),代碼的重復量就成了這些參數(shù)的不同數(shù)量的組合數(shù),動態(tài)參數(shù)越多,重復量越大。

對于第二個問題,以下的錯誤代碼為其證據(jù):

復制代碼 代碼如下:


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);
}


這兩個問題都很好解決,給一個正確的代碼例子大家看看即可:

復制代碼 代碼如下:


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;


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

對參數(shù)進行排列組合,然后寫各種組合的 SQL,這個思路很奇怪。問題是,很多初學者,都有這個思維習慣。本人不是計算機科班出身,不知道是否哪本教科書,就是如此教導的。但很不幸的是,這個思維習慣是錯誤的。

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


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

復制代碼 代碼如下:


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



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

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

這是一個很好的思路,同樣可以用在這里的 sql 拼接中。因此,我們在后面的代碼中,使用了這個:

復制代碼 代碼如下:


if(id != null)


上述代碼中,

addParameterValue(cmd,name); 是一個簡單封裝的函數(shù),用來封裝如下一小段代碼,目的是讓最后的代碼,較為簡捷直觀:

復制代碼 代碼如下:


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


當然,這個 addParameterValue() 封裝函數(shù),是可有可無的。多寫幾個 DbParameter p = cmd.CreateParameter() 并沒有什么大問題。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 松原市| 景谷| 奉新县| 宿州市| 安远县| 水城县| 泉州市| 浦城县| 分宜县| 南皮县| 昆明市| 金门县| 正镶白旗| 鄂伦春自治旗| 鄂托克旗| 五寨县| 寻乌县| 许昌市| 唐山市| 平乐县| 额济纳旗| 敦煌市| 东兰县| 慈利县| 南乐县| 宜兰县| 阳信县| 绥滨县| 白朗县| 贡觉县| 呼图壁县| 资溪县| 蒙山县| 宝鸡市| 家居| 吉木乃县| 垦利县| 广宗县| 廉江市| 资兴市| 乐山市|