編程經歷點滴 靜態SQL的拼接技能。本站提示廣大學習愛好者:(編程經歷點滴 靜態SQL的拼接技能)文章只能為提供參考,不一定能成為您想要的結果。以下是編程經歷點滴 靜態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() 並沒有甚麼年夜成績。