2012-04-07 25 views
2

我有這樣的代碼,它總是返回-1.I有三個表(圖片更暗示): enter image description hereC# - 受影響的行SELECT查詢編號始終是-1

我想看看是否行已經在ReservationDetails表中,並且不是要插入它。

try 
     { 
      SqlConnection conn = new SqlConnection... 
      SqlCommand slct = new SqlCommand("SELECT * FROM ReservationDetails WHERE [email protected] AND [email protected]", conn); 
      slct.Parameters.AddWithValue("@rID", (int)comboBox1.SelectedValue); 
      slct.Parameters.AddWithValue("@RNumber", dataGridView1.SelectedRows[0].Cells[0].Value); 

      int noRows;//counts if we already have the entry in the table 
      conn.Open(); 
      noRows = slct.ExecuteNonQuery(); 
      conn.Close(); 
      MessageBox.Show("The result of select="+noRows); 

      if (noRows ==0) //we can insert the new row 
+4

你爲什麼要對'SELECT'語句使用'ExecuteNonQuery'? – 2012-04-07 08:42:00

+0

那我該用什麼? P.S.它不是一個大項目,所以沒有人會插入任何東西:) – NiCU 2012-04-07 08:45:55

回答

7

你應該

1)改變你的TSQL至

SELECT COUNT(*) FROM ReservationDetails WHERE ... 

(更好的是,使用IF EXISTS ...)

2),並使用ExecuteScalar()

noRows = (int) slct.ExecuteScalar(); 

另外:您將需要使用交易(或其他一些原子技術),否則某人可能會在您測試並嘗試插入它之間插入一行...

所有這一切說,它會更好創建一個給定參數的存儲過程,以原子方式測試並插入表中,如果成功則返回1,如果該行已存在則返回0

7

您是否閱讀過SqlCommand.ExecuteNonQuery的文檔?

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

而你的查詢是SELECT。

+0

好的,但該方法的簡短評論說:「返回受影響的行數」我選擇 – NiCU 2012-04-07 08:47:36

+2

@nickNatra:你會期望多少行*受查詢影響*查詢不會影響*任何內容 - 只是查詢。 – 2012-04-07 09:03:50

+0

@Jon Skeet:當我在SQL Server Management中執行SELECT時,它說「#行受影響」。 – Carol 2014-11-17 22:12:57

2

最好在單個查詢中完成,以便您不需要請求服務器兩次。

創建一個像這樣的過程,並從代碼中調用它。

IF EXISTS (SELECT 1 from ReservationDetails WHERE [email protected] AND [email protected]) 
BEGIN 
insert into ReservationDetails values(@rID,@RNumber) 
END 
2

按照微軟:

You can use the ExecuteNonQuery to perform catalog operations (for example, querying the structure of a database or creating database objects such as tables), or to change the data in a database without using a DataSet by executing UPDATE, INSERT, or DELETE statements.

你可能需要代替的ExecuteNonQuery是的ExecuteScalar,把COUNT你的選擇查詢。

SqlCommand slct = new SqlCommand("SELECT COUNT(*) FROM ReservationDetails WHERE [email protected] AND [email protected]", conn); 

另外,儘量利用在C#中使用語句,所以你並不需要擔心手動關閉連接,即使事情失敗。

using (SqlConnection conn = new SqlConnection(connString)) 
{ 
    SqlCommand cmd = new SqlCommand(sql, conn); 
    try 
    { 
     conn.Open(); 
     newProdID = (Int32)cmd.ExecuteScalar(); 
    } 
    catch (Exception ex) 
    { 
     //Do stuff 
    } 
} 

見: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar.aspx

1

@nickNatra

當曾經使用

選擇命令

這將返回值。它可以是使用

DataSet或SqlDataReader的

command.ExecuteNonQuery()

僅用於當您使用

插入,更新,刪除其中行是在表中得到實現

是的,如果你想知道有多少記錄查詢在那裏。 您可以執行

一)修改您的查詢 「從表SELECT COUNT(*)

,你只會得到一個值,即。行數。

b)使用此查詢執行命令。的ExecuteScalar(),這將只返回第一行和第一列這是行計數

因此,這種滿足的用戶的需求。

乾杯!