2012-08-29 28 views
4

我有一個示例代碼如何在執行基於C#中的存儲過程的查詢後重新使用CommandText的SqlCommand對象?

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

+2

您必須更改命令類型與文本您嘗試喲執行查詢之前。 – Ademar

+3

_「在這種情況下,我必須創建一個SqlCommand對象的新實例嗎?」_我建議這樣做以避免這種混淆。創建一個'SqlCommand'不是很貴,所以你需要重用它。實際上,構造函數不過是設置屬性。 –

+1

不確定,但我想你也應該調用'aCommand.Parameters.Clear();' – Steve

回答

10

應該

aCommand.CommandType = CommandType.Text 

其實,CommandType默認值是CommandType.Text

+0

Upvoted。好點,我必須讀書:)。簡單明瞭。 –

+1

謝謝。這是你想要執行的查詢嗎? 'SELECT * FROM aTABLE'?如果是這樣,請刪除已添加的參數。 @SnakeEyes –

+1

我提供了一個例子,在那個查詢中我沒有使用參數,所以如果SqlCommand有參數,不管是因爲我沒有在查詢中使用它們。 –

3

你必須建造新Command對象擦除先前設定的參數和值。

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

呼叫ExecuteReader()方法,而不是ExecuteNonQuery獲取數據庫的結果。

5
aCommand.CommandType = CommandType.StoredProcedure; 
aCommand.Parameters.AddWithValue("@book_id", bookID); 
aCommand.Parameters.AddWithValue("@user_id", userID); 
  1. 指定存儲過程的名稱,你叫

    aCommand.CommandText=yourstoredprocedurename; 
    aCommand.ExecuteNonQuery(); 
    
  2. 然後打電話給你的選擇和SQLReader的獲取引起

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

的問題是,你有重用SqlCommandCommandTypeStoredProcedure但您想執行一個正常的SQL查詢與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; 
} 
相關問題