常見的誤解有:
1. 只用 ado.net ,無法進行動態 sql程式設計客棧 拼接。
2. 有幾個動態引數,**的重複量就成了這些引數的不同數量的組合數,動態引數越多,重複量越大。
對於第二個問題,以下的錯誤**為其證據:
複製** **如下:
if(id>0 && string.isnullorempty(name))
if(id<=0 && !string.isnullorempty(name))
if(id<=0 && !string.isnullorempty(name))
這兩個問題都很好解決,給乙個正確的**例子大家看看即可:
複製** **如下:
string sql ="select * from t1 where 1=1";
if(id != null)
if(!string.isnullorempty(name))
command.commandtext = sql;
這裡的技巧在於,使用了乙個 "where 1=1", 巧妙解決了後續 sql 拼接中,每行開頭是否要有 "and" 的問題。而這個 "where 1=1",並不會對資料庫的索引執行,造成效能上的影響。
對引數進行排列組合,然後寫各種組合的 sql,這個思路很奇怪。問題是,很多初學者,都有這個思維習慣。本人不是計算機科班出身,不知道是否哪本教科書,就是如此教導的。但很不幸的是,這個思維習慣是錯誤的。
"where 1=1" 雖是教科書中沒有的小技巧,卻很管用。
另外,在程式中,一般會在使用者介面上讓使用使用者錄入數字,這個數字的數值,在**中會自動變成 string,然後嘗試 string 轉換成 int/long,最後送到 sql 函式裡。這裡需要特別xziwrljygn注意的是,很多人把某個特殊的數值,作為「使用者無錄入的預設值」,正如本文開頭所寫的錯誤**那樣:
複製** **如下:
if(id>0 && string.isnullorempty(name))
問題在於,0 是否是不正常的業務數值,**中看不出來。不排除程式設計師隨意指定乙個數值,作為「使用者無錄入的預設值」,如果不巧這個預設值,實際上是有其他意義的,那就造成問題。
在資料庫的理論中,沒有指定的資料,是用 null 來表示的,不論是 string 還是 int/long。
這是乙個很好的思路,同樣可以用在這裡的 sql 拼接中。因此,我們在後面的**中,使用了這個:
複製** **如下:
if(id != null)
上述**中,
addparametervalue(cmd,name); 是乙個簡單封裝的函式,用來封裝如下一小段**,目的是讓最後的**,較為簡捷直觀:
複製** **如下:
dbparameter p = cmd.createparameter();
p.parametername = "@***";
p.value = ttt;
cmd.parameters.add(p);
當然,這個 addparametervalue() 封裝函式,是可有可無的。多寫幾個 dbparameter p = cmd.createparameter() 並沒有什麼大問題。
本文標題: 程式設計經驗點滴 動態sql的拼接技巧
本文位址: /shujuku/mssql/89090.html
jpa 動態sql拼接 JPA的動態查詢拼接
在使用spring jpa提供的方法只能進行簡單的crud,如果遇到複雜的情況就需要我們動態來構建查詢條件了。這裡我們來看使用criteriabuilder如何來構造查詢。核心 criteriabuilder criteriabuilder entitymanager.getcriteriabuil...
動態SQL語句的拼接實現
平常經常遇到一些語句需要使用動態語句,來實現作業任務的計畫執行。例如動態表名,在分表設計時使用了月份格式 a 201912 在實現此類格式表名的作業任務時,必須採用動態語句,以避免每月更換一次sql語句的尷尬。現將部分實際操作經驗總結如下 一 基本語句格式 定義變數,給變數賦值,使用變數拼接sql,...
SQL語句的動態拼接(1)
1 為什麼使用動態拼接?在自我學習中只是針對資料做簡單的增刪改查操作,但是在實際的業務中,經常會根據不同的情況執行不同的sql語句才可以。這個問題如何解決呢?2 解決方案 sql語句的動態拼接 3 動態拼接標籤 常見的動態拼接標籤 if where choose set trim foreach b...