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

來源:互聯網
上載者:User

常見的誤解有:
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() 並沒有什麼大問題。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.