一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Sql Server - 編程經驗點滴 動態SQL的拼接技巧

編程經驗點滴 動態SQL的拼接技巧

2019-12-24 14:20MSSQL教程網 Sql Server

眾多人在回復,其中至少有三位老兄,誤解了動態 SQL 的拼接。特寫此文,闡述一下其中的技巧。希望能糾正初學者的錯誤

常見的誤解有: 
1. 只用 ado.net ,無法進行動態 SQL 拼接。 
2. 有幾個動態參數,代碼的重復量就成了這些參數的不同數量的組合數,動態參數越多,重復量越大。 

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

復制代碼代碼如下:


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", 巧妙解決了后續 sql 拼接中,每行開頭是否要有 "and" 的問題。而這個 "where 1=1",并不會對數據庫的索引執行,造成性能上的影響。 

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

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


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

復制代碼代碼如下:


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



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

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

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

復制代碼代碼如下:


if(id != null) 


上述代碼中, 

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

復制代碼代碼如下:


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


當然,這個 addParameterValue() 封裝函數,是可有可無的。多寫幾個 DbParameter p = cmd.CreateParameter() 并沒有什么大問題。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产成人一区二区三区视频免费蜜 | 男人女人日皮视频 | 美女和男生搞基 | 国产一区视频在线免费观看 | 不卡一区二区三区 | 91探花在线播放 | 亚洲嫩模吧粉嫩粉嫩冒白浆 | 国产三级精品久久三级国专区 | 国产成人福利美女观看视频 | 美女扒下内裤让男人桶的图片 | 久久性生大片免费观看性 | 精品亚洲视频在线观看 | 成年人在线观看视频 | 赤坂丽女医bd无删减在线观看 | 草莓视频在线免费观看 | 日韩精品免费一区二区 | 精品一区二区国语对白 | 9久热久爱免费精品视频在线观看 | 日韩性事| 5g影院天天影院天天爽影院网站 | 爱草影院| 天堂在线中文字幕 | 成功精品影院 | 性欧美金发洋妞xxxxbbbb | 久久久久琪琪精品色 | 色字当头 | 久99视频精品免费观看福利 | 操一操影院 | 精品国内自产拍在线视频 | 国产成人在线综合 | 国产在线三级 | 猛操女人| 久久国产综合精品欧美 | 免费观看一级一片 | 嫩交18xxxx| 97色综合| 欧美大片一级片 | 国内精品久久久久影院网站 | 色老板视频 | freexxx性欧美3d动漫 | 色啪久久婷婷综合激情 |