中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

動態SQL的拼接技巧有哪些

發布時間:2021-12-01 13:57:38 來源:億速云 閱讀:129 作者:柒染 欄目:數據庫

這篇文章給大家介紹動態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() 并沒有什么大問題。

關于動態SQL的拼接技巧有哪些就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

sql
AI

潍坊市| 南溪县| 新巴尔虎左旗| 蓬溪县| 阿坝县| 镇巴县| 蛟河市| 玛沁县| 岳普湖县| 林周县| 昌邑市| 青川县| 巴里| 曲松县| 忻城县| 天气| 永仁县| 红原县| 石渠县| 民和| 梧州市| 肃北| 政和县| 长乐市| 红原县| 抚宁县| 扎鲁特旗| 烟台市| 卢湾区| 平原县| 逊克县| 栾城县| 隆回县| 太和县| 通道| 察雅县| 西昌市| 周宁县| 若羌县| 吴川市| 晋州市|