【发布时间】:2013-06-26 23:04:48
【问题描述】:
我正在尝试使用 OleDbCommand 参数化 SQL 创建以避免 SQL 注入。所以,我想要一个通用的方法来完成它并返回一个我可以进一步使用的对象。
我想使用页面上的代码: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似乎是正确的 -
哇,该代码与 Microsoft 网站上的完全一样。真是个坏例子
-
设置
CommandText的部分似乎是不必要的,应该删除) -
既然您使用的是
Reader,我将使用ExecuteReader()方法。
标签: c# database parameters oledb parameter-passing