簡體   English   中英

在基於C#中的存儲過程執行查詢后,如何為CommandText重用SqlCommand對象?

[英]How to re-use SqlCommand object for a CommandText after executing a query based on stored procedure in C#?

我有一個示例代碼

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對象來避免創建一個的方法嗎?

它應該是

aCommand.CommandType = CommandType.Text

實際上, CommandType的默認值是CommandType.Text

問題是你已經重用了一個SqlCommandCommandTypeStoredProcedure但你想用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;
}
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(); 

您必須構造新的Command對象以擦除先前設置的參數和值。

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

調用ExecuteReader()方法而不是ExecuteNonQuery來獲取數據庫結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM