另類SQL拼接方法

2022-01-13 14:22:12 字數 1787 閱讀 6700

在編寫sql的時候經常需要對sql進行拼接,拼接的方式就是直接string+處理,但這種情況有個不好的地方就是不能對sql進行引數化處理。下面介紹一種就算基於string +的方式也可以進行sql引數處理。

常見的sql拼接

id =3;

"select * from orders where employeeid="+id;

這樣存在的問題是相當明顯的就是sql注入,如果需要引數化那在編寫**的時候就相對多了些工作。下面介紹通過以上的編寫方式自動實現引數化功能。

自動引數化處理

id=3;

sql sql="select * from orders where empoyeeid=@id";

sql = sql +id;

更多實際應用效果
string city = "sdf";

sql sql = "select * from orders where employeeid=@i";

sql = sql + 3;

output(sql);

sql = "select * from order where employeeid in(@p1,@p2)";

sql = sql + 3 + 4;

output(sql);

sql = "select * from orders where 1=1";

if (city != null)

sql = sql+" and city=@p1" + city;

output(sql);

最終處理引數化的結果是:

sql:select * from orders where employeeid=@i

name:@i=3

-------------------------------------------

sql:select * from order where employeeid in(@p1,@p2)

name:@p1=3

name:@p2=4

-------------------------------------------

sql:select * from orders where 1=1 and city=@p1

name:@p1=sdf

-------------------------------------------

實現

為了達到以上處理效果針對性實現了乙個sql物件,通過運算子的過載把+運算修改一下。在處理的過程需要對sql語句和值的處理,首先當乙個sql string進桟的時候先分析一下這個string是否包括引數,如果包括就把引數壓到佇列中,大概**如下:

private void matchsql(string sql)

}}

簡單地乙個正則匹配就ok了,把找到的引數壓佇列中。有了這個依據那在向sql物件再次壓入值的時候就可以判斷引數佇列是否有引數,如果有就壓到sql引數集裡面,沒有就拼接到sql語句中。

public static sql operator +(sql sql, valuetype value)

return sql;

}public static sql operator +(sql sql, string subsql)

else

sql.addsql(subsql);

return sql;

}

這樣乙個基於拼接的sql引數化處理就完成了,以上緊緊是想表達一下運算子過載所帶來的效果,對於這種方式編寫引數化sql是好是壞就沒有乙個標準,相對一些人來說也許方便,但也有可能覺得這簡值一塌糊塗:)看自己喜好。

另類除錯方法

由於需要在沒有安裝vc的pc上進行除錯,所以在沒有ide環境的情況下trace巨集無法工作,而使用 messagebox 並不是乙個很好的方法。另一種簡單的方法是向console中輸出文字。在你的應用中增加如下 ifdef debug file fstdout null handle hstdout...

動態SQL拼接

多選刪除,修改筆記的型別,會出現效能差,用乙個sql最好。mybatis提供的動態sql拼接功能,可以優化資料層操作,減少冗餘sql的產生,進而提供資料訪問效能。動態sql經常與陣列,list,map 引數配合使用。動態updateupdate cn note setcn note type id ...

SQL拼接字段

拼接字段 select concat vend name,vend country,from vendors order by vend name 分析 1 儲存在vend name列中的名字 2 包含乙個空格和乙個左圓括號的串 3 儲存在vend country列中的國家 4 包含乙個右圓括號的串...