2016-02-01 30 views
1

我試圖從表中選擇最好的ID並插入一個變量(可以是int或long)。我的代碼有點不錯,但它沒有得到它應該的數字。相反,它始終爲-1。從表中選擇更大的ID

Ps1 - RXRX是ID列。

PS3的 - 我已經嘗試更換的ExecuteNonQuery來的ExecuteReader和他們,我得到以下錯誤:無法隱式轉換類型System.Data.SqlClient.SqlDataReaderint

private int aux; 

if(some condition) 
{ 
    MessageBox.Show("Should get a positive number in the next messageBox"); 
    cmd.CommandText = "SELECT MAX(RXRX) from tablee"; 
    aux = cmd.ExecuteNonQuery(); 
    MessageBox.Show(aux.ToString()); //Gets -1 all the time 
} 

有什麼不對?可悲的是,我不能使用LAST INSERT ID命令,因爲在插入任何數據之前,人員可以進入這個IF。

UPDATE:得到了答案。現在它的工作,謝謝大家:

if(some condition) 
{ 
      MessageBox.Show("Should get a positive number in the next messageBox"); 
      cmd.CommandText = "SELECT MAX(RXRX) from tablee"; 
      aux = Convert.ToInt32(cmd.ExecuteScalar()); //Thanks Joachim Isaksson 
      MessageBox.Show(auxiliar.ToString()); //Now it works fine 
} 
+2

'cmd.ExecuteScalar()'怎麼樣? –

+0

我曾嘗試過,但有一些事情是不允許的。我得到的消息:「不能隱式轉換類型'到'int'。存在明確的轉換(你是否缺少一個轉換?)」 – ArthurMFB

回答

2

ExecuteScalar將返回您計數的單個值(或 - 技術上 - 結果的第一行的第一列),您可以將其轉換爲int並立即使用;

aux = Convert.ToInt32(cmd.ExecuteScalar()); 

由於SQL Server將返回的數量,同時一個Int32 - 例如 - Oracle返回一個完全不同的類型,最安全的途徑通常是使用Convert.ToInt32得到的值(假設你計數小於2十億行)

+0

準確!感謝好友,我會更新帖子以幫助其他人。一個問題是,對於不同的命令使用相同的MySqlCommand是不是一個好主意?就像,每當我需要時更改cmd.CommandText? – ArthurMFB

+0

@AururMFB通常情況下,您會希望在將查詢用於查詢後處理該命令,以便可以以最有效的方式自行清理。我會特別小心地重複使用像MySQL這樣的「主流」ADO提供程序。 –

+0

我明白了。我會開始使用它。 Ty再次。 – ArthurMFB

2

改爲使用ExecuteScalar()。這是查詢返回單個值時使用的方法。

3

ExecuteNonQuery不會返回從數據庫中選擇的值。

試試這樣說:

if(some condition) 
    { 
       MessageBox.Show("Should get a positive number in the next messageBox"); 
       cmd.CommandText = "SELECT MAX(RXRX) from tablee"; 
       object readedValue= cmd.ExecuteScalar(); 
       if(readedValue != null) 
       { 
       aux=(int)readedValue; //Will always get the value 
       } 
       MessageBox.Show(aux.ToString()); 
    } 
+0

我試過了。我收到以下消息:不能將類型''隱式轉換爲'int'。存在明確的轉換(您是否缺少演員?) – ArthurMFB

+0

將其轉換爲'int'。檢查更新的答案 – Zippy

+0

在eoq.exe中發生未處理的異常類型'System.InvalidCastException' 附加信息:「無效的轉換」 – ArthurMFB

1

ExecuteNonQuery()返回受影響的行數。由於您的查詢不會影響任何行,因此結果爲-1。 (如果您 - 例如 - 刪除了兩行,結果將是2)。

要從SQL查詢中檢索單個結果,請使用ExecuteScalar()。這將返回一個object,表示查詢結果第一行的第一列。
如果未返回結果,則返回值爲null
如果返回的值是SQL NULL,結果將是DbNull.Value

+0

瞭解。沒有意識到這種模式。謝謝哥們。 – ArthurMFB