如果作为参数传递,则关闭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() 执行

如果作为参数传递,则关闭OleDbConnection

您展示的示例非常糟糕。我认为微软应该被告知他们网站上的这个非常糟糕的代码。

我将尝试做一个更好的例子,并解释为什么

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,具体取决于命令文本)。当然,在打开连接的地方,也会关闭它