sql預編譯語句
你上面的語句是傳參數查詢嗎?應該是參數沒有傳進去,下面的語句語法沒有錯誤,但是可以返回的查詢結果不是正確的.建議寫成封裝的,不易SQL注入.
比如:
public DataTable SelectAId(pb_list_of_value prep )
{
sql = "SELECT tstand_code from pb_list_of_value where display_value=@display_value and type =@type order by display_value desc ";
sqlpar = new List<SqlParameter>();
sqlpar.Add(newSqlParameter("@display_value",pb_list_of_value.display_value));
DataTable ds=DBHepler.SQLDBHepler.Search(sql,sqlpar,CommandType.Text);
return ds;
}
加粗部分不換行
❷ sql預編譯語句就是不執行,怪怪的,求解,急~~
DataSource dataSource = new DataSource(); // 實例化Datasource
QueryRunner runQuery = new QueryRunner(dataSource);
runQuery.batch(sql,object); // sql : "DELETE FROM english WHERE id = ? " 預編譯
Object 是一個二維數組 對應你要刪除的值希望有幫助!可以到CSDN,IT實驗室,365testing
❸ sql中帶有like時如何使用預編譯
like語句實際上就是模糊的欄位查詢,通常與「%」(一個或多個)結合使用。
舉例說明:
sql:SELECT * FROM tablename T WHERE T.name LIKE '%zhang%';
解釋:以上語句就就是查詢出tablename表中name欄位帶有「zhang」的所有記錄。
備註:存儲過程中用"||"表示連接符,用單引號(「'」)表示字元連接。
SELECT * FROM tablename T WHERE T.name LIKE '%'||'zhang'||'%'.
❹ 資料庫預編譯語句in(查詢條件),如果查詢條件只有一個,可以運行,如果多個條件,則不能運行,為什麼
你這個是把usercode的值作為變數給了語句里的?
這時候就有個問題
你的userCode是string類型的數組吧。。。
那麼傳進去的應該是'10086','10087'
如果不是這個問題你就在執行SQL語句之前先輸出一下語句 日誌里看看是哪裡格式不對了
❺ 預編譯sql語句就sql綁定變數嗎
1. 認識綁定變數:
綁定變數是為了減少解析的,比如你有個語句這樣
select aaa,bbb from ccc where ddd=eee;
如果經常通過改變eee這個謂詞賦值來查詢,像如下
select aaa,bbb from ccc where ddd=fff;
select aaa,bbb from ccc where ddd=ggg;
select aaa,bbb from ccc where ddd=hhh;
每條語句都要被資料庫解析一次,這樣比較浪費資源,如果把eee換成「:1」這樣的綁定變數形式,無論ddd後面是什麼值,都不需要重復解析
java實現綁定變數的方法:
[java] view plain
PreparedStatement pstmt = con.prepareStatement("UPDATE employees SET salay = ? WHERE id = ?");
pstmt.setBigDecimal(1, 15.00);
pstmt.setInt(2, 110592);
/result statmement: UPDATE employees SET salay = 15.00 WHERE id = 110592
pstmt.executeQuery();
假設要將id從1到10000的員工的工資都更新為150.00元,不使用綁定變數,則:
[java] view plain
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 1");
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 2");
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 3");
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 4");
....
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 10000");
使用綁定變數,則:
[java] view plain
PreparedStatement pstmt;
for (id = 1; id < 10000; id )
{
if (null == pstmt)
pstmt = con.prepareStatement("UPDATE employees SET salay = ? WHERE id = ?");
pstmt.setBigDecimal(1, 150.00);
pstmt.setInt(2, id);
pstmt.executeQuery();
}
二者區別在於,不用綁定變數,則相當於反復解析、執行了1w個sql語句。使用綁定變數,解析sql語句只用了一次,之後的9999次復用第一次生成的執行計劃。顯然,後者效率會更高一些。
2. 什麼時候不應該/不必要使用綁定變數
a. 如果你用數據倉庫,一條大查詢一跑幾個小時,根本沒必要做綁定變數,因為解析的消耗微乎其微。
b. 變數對優化器產生執行計劃有很重要的影響的時候:綁定變數被使用時,查詢優化器會忽略其具體值,因此其預估的准確性遠不如使用字面量值真實,尤其是在表存在數據傾斜(表上的數據非均勻分布)的列上會提供錯誤的執行計劃。從而使得非高效的執行計劃被使用。
3. 綁定變數在OceanBase中的實現
目
前OceanBase中實現了綁定變數,目的主要是為了編程方便,而不是為了降低生成執行計劃的代價。為什麼呢?因為OceanBase中目前使用的是一
種」靜態執行計劃「,無論什麼Query,執行流程都一樣。OB在前端代理ObConnector中實現綁定變數,將用戶傳入的變數進行
to_string()操作,替代SQL語句中相應的部分,形成一個完整的SQL。然後這個SQL傳遞給MS,MS按照標准流程來解析和執行。相信不遠的
將來,OB將會實現真正意義上的綁定變數,讓用戶享受到綁定變數帶來的好處。
❻ 什麼是sql注入如何防止sql注入
SQL注入是一種非常常見的資料庫攻擊手段,同時也是網路世界中最普遍的漏洞之一,簡單理解就是惡意用戶通過在表單中填寫包含SQL關鍵字的數據來使資料庫執行非常規代碼的過程。
問題來源是,SQL資料庫的操作是通過SQL語句來執行的,而無論是執行代碼還是數據項都必須寫在SQL語句中,也就導致如果我們在數據項中加入了某些SQL語句關鍵字,比如SELECT、DROP等,這些關鍵字就很有可能在資料庫寫入或讀取數據時得到執行。
解決方案
方案一:
採用預編譯技術
使用預編譯的SQL語句,SQL語句的語義不會是不會發生改變的。預編譯語句在創建的時候就已經將指定的SQL語句發送給了DBMS,完成了解析,檢查,編譯等工作,所以攻擊者無法改變SQL語句的結構,只是把值賦給?,然後將?這個變數傳給SQL語句。當然還有一些通過預編譯繞過某些安全防護的操作,大家感興趣可以去搜索一下。
方案二:
嚴格控制數據類型
在java、c等強類型語言中一般是不存在數字型注入的,因為在接受到用戶輸入id時,代碼一般會做一個int id 的數據類型轉換,假如我們輸入的是字元串的話,那麼這種情況下,程序就會報錯。但是在PHP、ASP這些沒有強調處理數據類型的語言,一般我們看到的接收id的代碼都是如下等代碼。
方案三:
對特殊的字元進行轉義
數字型注入可以通過檢查數據類型防止,但是字元型不可以,那麼怎麼辦呢,最好的辦法就是對特殊的字元進行轉義了。比如在MySQL中我們可以對" '
"進行轉義,這樣就防止了一些惡意攻擊者來閉合語句。當然我們也可以通過一些安全函數來轉義特殊字元。如addslashes()等,但是這些函數並非一勞永逸,攻擊者還可以通過一些特殊的方式繞過。
❼ c#怎麼預編譯SQL語句,就是像Java裡面那個PreparedStatement那樣的,不知道C#哪個類是對應的
C# 連接各種資料庫
sql server資料庫 :SqlParameter
eg: SqlParameter sPar=new SqlParameter("@name",value);
❽ oracle 存儲過程中的sql語句可以象java一樣寫成預編譯嗎
如果載入一些內容,載入設置算的話,可以的,就是格式語言啥的不一樣