如果作为参数传递,则关闭OleDbConnection
本文关键字:OleDbConnection 参数传递 如果 | 更新日期: 2023-09-27 18:20:07
我正在尝试使用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()
执行
您展示的示例非常糟糕。我认为微软应该被告知他们网站上的这个非常糟糕的代码。
我将尝试做一个更好的例子,并解释为什么
public OleDbCommand CreateMyOleDbCommand(OleDbConnection connection,
string queryString, OleDbParameter[] parameters)
{
OleDbCommand command = new OleDbCommand(queryString, connection);
command.Parameters.AddRange(parameters);
return command;
}
首先,该方法应该返回一个OleDbCommand,其参数和命令文本已正确初始化。因此,我将该方法的返回值从void更改为OleDbCommand。通过这种方式,您可以使用调用代码中的命令来执行查询。
其次,OleDbCommand有一个构造函数,用于接收命令文本和连接。使用此构造函数构建OleDbCommand将避免在之后传递命令文本以及设置与参数的连接。
第三,要将参数数组添加到OleDbCommand的参数集合,需要使用Parameters集合的AddRange方法。
现在,在您的调用代码中,在您定义了OleDbConnection的地方,您可以调用此方法,打开连接并执行命令(ExecuteReader、ExecuteNonQuery或ExecuteScalar,具体取决于命令文本)。当然,在打开连接的地方,也会关闭它