2012-06-23 71 views
0

我想從表中獲取行並將它們插入到另一個表中。爲此我編寫了這個簡單的代碼,但我無法弄清楚問題所在。Executenonquery有-1時,我執行語句

正如你可以看到我用ExecuteNonQuery執行我的發言後,然後用消息框看到輸出,但在消息框中輸出爲-1

for (int i = 1; i <= 10; i++) 
{ 
    SqlCommand cmd = new SqlCommand("Select exp_date from tbl_expences where exp_id='" + i + "'", con); 

    int j = cmd.ExecuteNonQuery(); 

    MessageBox.Show(Convert.ToString(j)); 

    if (j > 1) 
    { 
     string date = cmd.ExecuteScalar().ToString(); 

     MessageBox.Show(date); 
     SqlCommand cmd1 = new SqlCommand("update other_expensive set exp_date='" + date + "' where exp_id='" + i + "'", con); 
    } 
} 
+0

'.ExecuteNonQuery()'的返回值是** INSERT,UPDATE或DELETE操作影響的**行數。由於你的'SELECT'不影響任何行 - >該值沒有被定義並且返回-1。這是由設計人員[和MSDN](http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx)記錄,供大家看到。如果您需要首先了解這樣的內容,請檢查MSDN! –

回答

2

ExecuteNonQuery()用於INSERTUPDATEDELETE。如果您想使用SELECT,請使用ExecuteReader()

+0

現在我改變了 int j = cmd.ExecuteNonQuery(); by int j = Convert.ToInt32(cmd.ExecuteReader()); 和我有個例外 無法強制類型'System.Data.SqlClient.SqlDataReader'的對象鍵入'System.IConvertible'。 –

+0

'ExecuteReader'返回'SqlDataReader'。看看msdn的工作原理。 – Femaref

+0

你能準確解釋你想要達到的目標嗎? – XIVSolutions

0

爲什麼要運行20(可能是30,取決於此代碼中發生了什麼)聲明?

ExecuteNonQuery文檔:

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

(強調)

爲什麼不乾脆:

update oe set exp_date=e.exp_date 
from 
    other_expensive oe 
     inner join 
    tbl_expense e 
     on 
      oe.exp_id = e.exp_id 
where 
    e.exp_id between 1 and 10 

這將做所有並行更新,用一個查詢,避免循環,而「步步爲營一步「的方法,你似乎試圖使用。