【问题标题】:Close OleDbConnection if passed as parameter如果作为参数传递,则关闭 OleDbConnection
【发布时间】: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()

【问题讨论】:

  • 首先,据我所知,您传递给OleDbCommandqueryString 是命令文本,那么为什么要在之后设置此属性而不是手动设置,而不是在构造函数中传递呢?最好在调用CreateMyOleDbCommand 的方法中关闭连接(如果需要)。由于方法命名,返回OleDbCommand 似乎是正确的
  • 哇,该代码与 Microsoft 网站上的完全一样。真是个坏例子
  • 设置CommandText的部分似乎是不必要的,应该删除)
  • 既然您使用的是Reader,我将使用ExecuteReader() 方法。

标签: c# database parameters oledb parameter-passing


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-06
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多