2011-03-18 46 views
12

這是我的(粗糙)碼(DAL):的ExecuteNonQuery()

int i; 
// Some other declarations 

SqlCommand myCmdObject = new SqlCommand("some query"); 

conn.open(); 
i = myCmdObject.ExecuteNonQuery(); 
conn.close(); 

的問題是:即使有存在於我的SELECT查詢的記錄,在i值保持-1

可能是什麼問題?

回答

39

你進行什麼類型的查詢?使用ExecuteNonQuery打算用於UPDATEINSERTDELETE查詢。按照the documentation

對於UPDATE,INSERT和DELETE 語句,返回值是 數受 命令行。當 表正被插入或更新時, 返回值包括受插入或 更新操作以及受觸發器或觸發器影響的 行數受影響的 行的數量。對於所有其他類型的 語句,返回值爲-1。

+1

的第一列是什麼返回值,如果我們運行一個StoredProcedure的,這將在插入或更新或刪除記錄表, – Raghuveer 2012-05-31 10:29:49

1

你能發表確切的查詢嗎? ExecuteNonQuery方法返回@@ROWCOUNT Sql Server變量,它在最後一個查詢執行後什麼是ExecuteNonQuery方法返回的。

1

如果你想要的是從查詢得到的只是一個整數,使用:

myCmdObject.ExecuteScalar() 
+0

的ExecuteScalar將只返回價值是在執行查詢的第一行的第一列的值。 – 2011-03-18 07:25:32

+0

這是事實,但正如我所說的選擇一個整數時,它應該是在第一行:) – IordanTanev 2011-03-18 07:27:52

1

ExecuteNonQuery方法用於SQL語句,這些語句查詢,如INSERTUPDATE,......你想,如果你希望你的語句返回結果使用ExecuteScalarExecuteReader(即查詢) 。

0

從MSDN:SqlCommand.ExecuteNonQuery Method

可以使用ExecuteNonQuery到 執行目錄操作( 例如,查詢 數據庫的結構或創建數據庫對象 作爲表,例如),或改變數據 通過執行UPDATE,INSERT或DELETE 語句而不使用DataSet 。

雖然爲ExecuteNonQuery返回 沒有行,任何輸出參數或映射到參數 返回值 用數據填充。

對於UPDATE,INSERT和DELETE 語句,返回值是 命令影響的行數。當 表正被插入或更新時, 返回值包括受插入或 更新操作以及受觸發器或觸發器影響的 行數受影響的 行的數量。對於所有其他類型的 語句,返回值爲-1。如果 發生回滾,則返回值爲 也是-1。

您使用SELECT查詢,這樣你會得到-1

0

,如果你想運行更新,刪除, 或insert語句,你應該使用 爲ExecuteNonQuery。 ExecuteNonQuery 返回受 該語句影響的行數。

How to Set Count On

5

您使用EXECUTENONQUERY()INSERTUPDATEDELETE

SELECT必須使用EXECUTEREADER() .........

11

每當要執行的SQL語句不應該返回一個值或一個記錄集,爲ExecuteNonQuery應該被使用。

所以,如果你想運行一個update,delete或insert語句,你應該使用ExecuteNonQuery。 ExecuteNonQuery返回該語句影響的行數。這聽起來很不錯,但是無論何時使用SQL Server 2005 IDE或Visual Studio創建存儲過程,它都會添加一條破壞所有內容的小行。

即行是:SET NOCOUNT ON;此行打開SQL Server的NOCOUNT功能,該功能「停止指示被作爲結果一部分返回的Transact-SQL語句影響的行數」消息,因此它會使存儲過程始終返回-1從應用程序調用(在我的情況下是一個Web應用程序)。

總之,從您的存儲過程中刪除了這一行,你現在會得到指示受該語句影響的行數的值。

快樂編程!

http://aspsoft.blogs.com/jonas/2006/10/executenonquery.html