在基于C#中的存储过程执行查询后,如何为CommandText重用SqlCommand对象?

时间:2012-08-29 08:33:12

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

我有一个示例代码

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对象来避免创建一个的方法吗?

4 个答案:

答案 0 :(得分:10)

应该是

aCommand.CommandType = CommandType.Text

实际上,CommandType的默认值为CommandType.Text

答案 1 :(得分:7)

问题是您已重用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;
}

答案 2 :(得分:5)

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();
    

答案 3 :(得分:3)

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

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

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