我正在嘗試使用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()
首先,因爲我明白你傳遞給OleDbCommand的'queryString'是命令文本,所以你爲什麼設置這個屬性之後比手動,而不是傳遞它構造函數?在調用'CreateMyOleDbCommand'的方法中,連接最好關閉(如果需要的話)。由於方法命名它似乎是正確的返回'OleDbCommand' –
哇代碼是完全一樣的微軟網站。真的是一個不好的例子 – Steve
似乎設置'CommandText'的部分是不必要的,應該刪除) –