如何檢查在ExecuteNonQuery之後返回沒有行的SELECT sql語句返回沒有行?ExecuteNonQuery for SELECT sql語句不返回行
回答
ExecuteNonQuery Method
返回受INSERT
,UPDATE
或DELETE
影響的行數。如前所述,此方法將用於執行DML(數據操作語言)語句。
ExecuteReader Method
將返回SELECT
的結果集。這個方法用於查詢一堆結果,比如表,視圖等等。
ExecuteScalar Method
將在SELECT
語句的第一行第一列中返回單個值。如果您希望僅返回查詢中的一個值,則使用此方法。
總之,在使用ExecuteNonQuery方法時,您沒有SELECT
聲明的結果是正常的。改爲使用ExecuteReader。使用ExecuteReader
方法,將會知道通過返回的SqlDataReader
對象的實例返回了多少行。
int rows = 0;
if (reader.HasRows)
while (reader.Read())
rows++;
return rows; // Returns the number of rows read from the reader.
我沒有看到任何方式來做到這一點。使用ExecuteScalar
和select count(*) where
...來計算符合原始SELECT查詢條件的行。下面的例子,從here轉述:
using (SqlCommand thisCommand =
new SqlCommand("SELECT COUNT(*) FROM Employee", thisConnection))
{
Console.WriteLine("Number of Employees is: {0}",
thisCommand.ExecuteScalar());
}
如果需要行也,你已經使用了ExecuteReader
,我想象。
我無法更改其動態構建的sql查詢 – Lyle 2010-11-26 15:50:28
改爲使用ExecuteReader
方法。這將返回一個SqlDataReader
,它有一個HasRows
屬性。
ExecuteNonQuery
不應該用於SELECT
聲明。
現在已經很晚了,但最近我遇到了這個問題,並認爲這對後來的其他人(如我)尋求相同問題的幫助會有所幫助。無論如何,我相信你實際上可以使用你正在嘗試的方式使用ExecuteNonQuery。但是...你必須調整你的底層SELECT查詢到一個存儲過程,而不是SELECT查詢和一個設置爲等於行數的輸出參數。
作爲MSDN文檔中所述:
雖然爲ExecuteNonQuery返回任何行,任何輸出參數或返回映射到參數的值被填充數據。
鑑於此,我是這麼做的。順便說一句,如果這裏有任何缺陷,我都會喜歡那裏的專家的反饋,但它似乎適用於我。
首先,你的存儲過程應該有兩個SELECT語句:一個來回報您的數據集和其他依賴於輸出參數返回的記錄數:
CREATE PROCEDURE spMyStoredProcedure
(
@TotalRows int output
)
AS
BEGIN
SELECT * FROM MyTable; //see extra note about this line below.
SELECT @TotalRows COUNT(*) FROM MyTable;
END
其次,添加以下代碼(在VB。淨,使用SqlCommand等..)。
Dim cn As SqlConnection, cm As SqlCommand, dr As SqlDataReader
Dim myCount As Int32
cn = New SqlConnection("MyConnectionString")
cn.Open() //I open my connection beforehand, but a lot of people open it right before executing the queries. Not sure if it matters.
cm = New SqlCommand("spMyStoredProcedure", cn)
cm.CommandType = CommandType.StoredProcedure
cm.Parameters.Add("@TotalRows", SqlDbType.Int).Direction = ParameterDirection.Output
cm.ExecuteNonQuery()
myCount = CType(cm.Parameters("@TotalRows").Value, Integer)
If myCount > 0 Then
//Do something.
End If
dr = cm.ExecuteReader()
If dr.HasRows Then
//Return the actual query results using the stored procedure's 1st SELECT statement
End If
dr.Close()
cn.Close()
dr = Nothing
cm = Nothing
cn = Nothing
就是這樣。
額外的說明。我認爲你可能希望獲得「MyCount」金額來做一些事情,而不是確定是否繼續返回查詢。原因是因爲用這種方法,你並不需要那麼做。由於在獲取計數後我正在使用「ExecuteReader」方法,因此可以使用數據閱讀器的「HasRows」屬性確定是否繼續返回預期的數據集。然而,要返回一個數據集,你需要一個返回一個數據集的SELECT語句,這也是我的存儲過程中第一個SELECT語句的原因。
順便說一句,有關使用「的ExecuteNonQuery」方法,這個方法的很酷的事情是,你可以關閉DataReader的,之前用它來獲得總行之前數關閉DataReader的(你不能讀取輸出參數,正是我想要做的,這種方法解決了這個問題)。我不確定在解決這個問題時是否存在性能問題或缺陷,但正如我所說的......它對我有用。 = D
是的,由於在`SqlCommand`中執行了兩次SQL,性能受到了影響。如果有DML語句,它們將執行兩次。另外,在執行SqlCommand之前,確實沒有理由打開連接;這只是意味着你要保持連接打開時間更長。你可以將它移動到參數聲明之後。並且通過最後一個「End If」的Connection.Open()應該位於Try/Catch中,以便在發生異常時可以在Finally塊中正確關閉Reader和Connection。 – 2015-01-22 20:47:35
- 1. 檢查SQL SELECT語句不返回行
- 2. 返回select語句SQL
- 3. select語句的返回值
- 4. MySQL的SELECT語句不返回行
- 5. pdo select語句不返回行
- 6. 在SQL select語句中返回table.column
- 7. C#中ExecuteNonQuery的SQL語句
- 8. jquery的select語句返回
- 9. SELECT語句返回結果
- 10. SELECT語句返回ID
- 11. MySQL SELECT語句只返回一行
- 12. select語句返回附加行
- 13. CQL SELECT語句只返回行鍵
- 14. SQL:對SELECT語句返回的行進行編號
- 15. SELECT語句不返回MAX數
- 16. PL/SQL Update語句返回多行
- 17. SELECT FOR UPDATE返回零行
- 18. SQL SELECT語句
- 19. 添加文本FOR XML SQL SELECT語句
- 20. 返回語句vs不返回語句?
- 21. 當使用IN時,T-SQL Select語句返回零行
- 22. SQL SELECT語句(在vb.net)返回空的和/或怪異行
- 23. 返回語句不退出for循環
- 24. 如何組合返回多行的SELECT語句和INSERT語句?
- 25. ExecuteNonQuery不返回值?
- 26. 更新語句和ExecuteNonQuery不返回C#,MySQL
- 27. SQL SELECT語句多行
- 28. 返回語句不執行
- 29. 返回語句不執行
- 30. SQL SELECT語句
你能否提供一些背景知識?更好的是,代碼?你的`command`是否有參數? – 2010-11-24 17:25:48