【问题标题】:How to re-use SqlCommand object for a CommandText after executing a query based on stored procedure in C#?在 C# 中执行基于存储过程的查询后,如何为 CommandText 重用 SqlCommand 对象?
【发布时间】:2012-08-23 19:40:03
【问题描述】:

我有一个示例代码

aCommand.CommandType = CommandType.StoredProcedure;
aCommand.Parameters.AddWithValue("@book_id", bookID);
aCommand.Parameters.AddWithValue("@user_id", userID);

然后我想使用CommandText 执行一个简单的查询:

aCommand.CommandText = "SELECT * FROM aTABLE";
aCommand.ExecuteNonQuery();

但出现错误:

异常:找不到存储过程“SELECT * FROM aTABLE”

在这种情况下,我必须创建一个 SqlCommand 对象的新实例?

这是一种使用相同的SqlCommand 对象来避免创建一个的方法?

【问题讨论】:

  • 在尝试执行查询之前,您必须将命令类型更改回文本。
  • "在这种情况下,我必须创建一个新的 SqlCommand 对象实例吗?" 我建议这样做以避免这种混淆。创建SqlCommand 并不昂贵,以至于您需要重复使用它。实际上构造函数只是设置属性而已。
  • 不确定,但我认为您也应该致电aCommand.Parameters.Clear();

标签: c# .net sql-server asp.net-mvc-3 tsql


【解决方案1】:

应该是

aCommand.CommandType = CommandType.Text

其实CommandType的默认值是CommandType.Text

【讨论】:

  • 赞成。好点,我必须看书:)。简单明了。
  • 谢谢。这是您要执行的查询吗? SELECT * FROM aTABLE?如果是这样,请删除您添加的参数。 @SnakeEyes
  • 我提供了一个例子,在那个查询中我没有使用参数,所以如果 SqlCommand 有参数,不管因为我没有在查询中使用它们。
【解决方案2】:

问题是你重用了一个SqlCommand CommandTypeStoredProcedure 但你想用CommandType.Text 执行一个普通的sql查询。

“在这种情况下,我必须创建一个新的 SqlCommand 对象实例吗?”

我建议这样做以避免这种混淆。创建SqlCommand 并不昂贵,以至于您需要重复使用它。其实构造函数只是设置属性而已。

来自ILSpy

// System.Data.SqlClient.SqlCommand
// this() does only call _SuppressFinalize
public SqlCommand(string cmdText, SqlConnection connection) : this()
{
    this.CommandText = cmdText;
    this.Connection = connection;
}

【讨论】:

    【解决方案3】:
    aCommand.CommandType = CommandType.StoredProcedure;
    aCommand.Parameters.AddWithValue("@book_id", bookID);
    aCommand.Parameters.AddWithValue("@user_id", userID);
    
    1. 指定你调用的存储过程名称

      aCommand.CommandText=yourstoredprocedurename;
      aCommand.ExecuteNonQuery();
      
    2. 然后调用你的 select 和 sqlreader 来获取结果

      bCommand.CommandType = CommandType.Text
      bCommand.CommandText = "SELECT * FROM aTABLE";
      SqlDataReader rdr = bCommand.ExecuteReader();
      

    【讨论】:

      【解决方案4】:

      您必须构造新的Command 对象以清除之前设置的参数和值。

      aCommand=new SqlCommand();
      aCommand.Connection=cn;
      aCommand.CommandText = "SELECT * FROM aTABLE";
      SqlDataReader reader=aCommand.ExecuteReader();
      

      调用ExecuteReader() 方法而不是ExecuteNonQuery 来获取数据库结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 2013-01-21
        • 1970-01-01
        • 2022-12-31
        • 1970-01-01
        • 2013-01-08
        • 2020-04-04
        相关资源
        最近更新 更多