4

我有一个示例代码

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”

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

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

4

4 回答 4

10

它应该是

aCommand.CommandType = CommandType.Text

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

于 2012-08-29T08:34:31.287 回答
7

问题是你重用了一个SqlCommandthat CommandTypeisStoredProcedure但你想用CommandType.Text.

“在这种情况下,我必须创建一个新的 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;
}
于 2012-08-29T08:44:24.547 回答
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();
    
于 2012-08-29T08:41:32.493 回答
3

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

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

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

于 2012-08-29T08:39:09.263 回答