2011-08-01 48 views
3

我在C#中使用OLEDB paramaterized串/網絡,不喜歡OLEDB的方式做參數用問號:通過解析爲OLEDB

using (OleDbConnection sqlConnect = drtevs.GetConnection()) 
{ 

OleDbCommand command.CommandText = "UPDATE NAME SET FIRST_NAME = ?, LAST_NAME = ? WHERE ID = ?;"; 
command.Parameters.Add(new OleDbParameter("@FIRST_NAME", txtFirst)); 
command.Parameters.Add(new OleDbParameter("@LAST_NAME", txtLast)); 
command.Parameters.Add(new OleDbParameter("@ID", 12)); 
command.ExecuteNonQuery(); 

} 

我看到的是他們沒有被命名的問題,因此不能重用它們。有沒有更好的方法來用OleDB做參數?如果有人可以給我的代碼來執行類似LINQ-TO-SQL代碼方式如下:

db.ExecuteQuery("UPDATE NAME SET FIRST_NAME = {0}, LAST_NAME = {1} WHERE ID = {2}", txtFirst, txtLast, 12); 

我知道本地SQL .NET提供了命名參數(前@FIRST_NAME,@LAST_NAME),但由於我與SQL工作服務器和Oracle不是一個選項。

編輯: 我想避免SQL注入和清理我的參數,也能夠插入不可序列化的對象,如字節數組。

所有答案給出到目前爲止如果我的姓氏都將失敗「」 DROP TABLE名稱 - 」,另外它會造成損害到我的分貝

回答

1

我們可以大致模仿linq-to-sql行爲。 From documentation on the function

通過使用Console.WriteLine()和String.Format()所使用的相同捲曲表示法,在查詢文本中表示參數。實際上,String.Format()實際上是在您提供的查詢字符串上調用的,用生成的參數名稱(例如@ p0,@ p1 ...,@ p(n))替換花括號參數。

所以應該可以得出類似的代碼,有一點需要注意:因爲OleDb的不支持命名的參數,多個或亂序行爲佔位符的使用是不確定的。但是,我們至少可以得到以下幾點:

public void ExecuteQuery(string sql, params object[] parameters) 
{ 
    //format the sql string with safe parameter names 
    var paramNames = new string[parameters.Length]; 
    for (int i = 0; i<parameters.Length; i++) 
    { 
     paramNames[i] = "?"; 
    } 
    sql = string.Format(sql, paramNames); 

    using (OleDbConnection sqlConnect = drtevs.GetConnection()) 
    { 
     OleDbCommand command.CommandText = sql; 

     foreach (int i = 0; i< parameters.Length; i++) 
     { 
      command.Parameters.Add(new OleDbParameter("?", parameters[i])); 
     } 

     command.ExecuteNonQuery(); 

    } 
} 

注意,這不會爲使用相同的佔位符兩次查詢工作,但那是因爲OleDb的不支持命名的參數,如LINQ到SQL的功能。

+0

是不是重複使用了一個具體問題?另外,如果提供的SQL格式爲「... ... {1} ...和{0} ...」,則會發生什麼情況。排序不正確。 –

+0

你是對的@Lasse,昨晚我得出了同樣的結論。所以今天早上我編輯了Joel的代碼,但我相信這會起作用。我仍然相信自從他讓我開始之後他就獲得了信譽 –

3

如果你想重新使用值,你要理智查詢,也許是道德等價的:

declare @id int = ? 
declare @when datetime = ? 
... 
// some complex query involving @id and @when 

這裏?僅限於頂部,和上下文是清楚的。