0

我正在尝试使用 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()

4

1 回答 1

2

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

我会尝试做一个更好的例子并解释原因

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

于 2013-06-26T23:28:43.230 回答