程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> 編程經歷點滴 靜態SQL的拼接技能

編程經歷點滴 靜態SQL的拼接技能

編輯:MSSQL

編程經歷點滴 靜態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() 並沒有甚麼年夜成績。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved