2013-06-26 14 views
0

我正在嘗試使用OleDbCommand參數化SQL創建以避免SQL注入。所以,我想要一個可以做到的通用方法,並返回一個我可以繼續使用的對象。如果作爲參數傳遞,關閉OleDbConnection

我想使用的代碼頁:http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand.parameters.aspx

public void CreateMyOleDbCommand(OleDbConnection connection, 
    string queryString, OleDbParameter[] parameters) 
{ 
    OleDbCommand command = new OleDbCommand(queryString, connection); 
    command.CommandText = 
     "SELECT CustomerID, CompanyName FROM Customers WHERE Country = ? AND City = ?"; 
    command.Parameters.Add(parameters); 

    for (int j=0; j<parameters.Length; j++) 
    { 
     command.Parameters.Add(parameters[j]) ; 
    } 

    string message = ""; 
    for (int i = 0; i < command.Parameters.Count; i++) 
    { 
     message += command.Parameters[i].ToString() + "\n"; 
    } 
    Console.WriteLine(message); 
} 

問題1.它傳遞參數作爲值。那麼,我必須最後撥打connection.Close嗎? connection.Close沒有在上面的鏈接中提到,那麼它是必需的?我不希望在執行代碼時將連接保持打開狀態。

問題2:我原來的代碼是:

dbReader = new OleDbCommand("select * from Table1 where Table1.Company = '" + company + "'", dbConnection).ExecuteReader(); 
dbReader.Read(); 

if (dbReader.HasRows) 
{ 
    //Do operations using dbReader["Company"] 
} 

而且

new OleDbCommand("...insert sql query...", dbConnection).ExecuteNonQuery() 

我應該返回OleDbCommand command?我可以執行爲command.ExecuteReader()command..ExecuteNonQuery()

+0

首先,因爲我明白你傳遞給OleDbCommand的'queryString'是命令文本,所以你爲什麼設置這個屬性之後比手動,而不是傳遞它構造函數?在調用'CreateMyOleDbCommand'的方法中,連接最好關閉(如果需要的話)。由於方法命名它似乎是正確的返回'OleDbCommand' –

+0

哇代碼是完全一樣的微軟網站。真的是一個不好的例子 – Steve

+0

似乎設置'CommandText'的部分是不必要的,應該刪除) –

回答

2

你已經顯示的例子非常糟糕。我認爲應該在他們的網站上告知微軟這個非常糟糕的代碼。

我會努力做一個更好的例子,並解釋爲什麼

public OleDbCommand CreateMyOleDbCommand(OleDbConnection connection, 
    string queryString, OleDbParameter[] parameters) 
{ 
    OleDbCommand command = new OleDbCommand(queryString, connection); 
    command.Parameters.AddRange(parameters); 
    return command; 
} 

首先,該方法應該與它的參數和其CommandText正確初始化返回一個OleDbCommand。所以我已經將該方法的返回值從void更改爲OleDbCommand。通過這種方式,您可以在調用代碼中使用該命令來執行您的查詢。

其次OleDbCommand有一個構造函數接收命令文本和連接。使用此構造函數構建OleDbCommand將避免後續傳遞命令文本,並設置連接參數。

第三,要將參數數組添加到OleDbCommand的參數集合中,您需要使用Parameters集合的AddRange方法。

現在在您的調用代碼中,您已經定義了OleDbConnection,您可以調用此方法,打開連接並執行命令(ExecuteReader,ExecuteNonQuery或ExecuteScalar,具體取決於命令文本)。當然,在你打開連接的地方,你也關閉它