2017-05-05 279 views
4

我正在使用Xamarin中的MySQL庫連接到我的數據庫。我正在調用ExecuteScalar()命令來檢查用戶是否存在於我的數據庫中。C#使用MYSQL ExecuteScalar()類型錯誤

我投的ExecuteScalar()爲Int32返回並存儲在一個名爲userCount一個的Int32變量,但是當我嘗試調用(int32)checkUser.ExecuteScalar();

這是怎麼建議在做Visual Studio是扔cast is not valid錯誤documentation,所以我很困惑。這裏是我的代碼:

using MySql.Data.MySqlClient; 
using System.Data; 

MySqlCommand checkUser = new MySqlCommand("SELECT COUNT(*) FROM <MyCoolDatabase> WHERE Userid = '" + username + "'", connection); 

Int32 userCount = (Int32)checkUser.ExecuteScalar(); //error is here 
if(userCount >0) 
{ 
    //do stuff 
} 
+0

你調試,並看到類型由'ExecuteScalar'回來了? –

+2

它聽起來像它返回一個null,這就是爲什麼演員失敗 – Jason

+0

你確定你沒有返回null嗎?順便說一下,文檔是在這個鏈接https://dev.mysql.com/doc/connector-net/en/connector-net-tutorials-sql-command.html –

回答

0

您鏈接到System.Data.SqlClient而不是MySQL.Data.MySqlClient

https://dev.mysql.com/doc/connector-net/en/connector-net-tutorials-sql-command.html

有一個例子有 -

object result = cmd.ExecuteScalar(); 
     if (result != null) 
     { 
      int r = Convert.ToInt32(result); 
      Console.WriteLine("Number of countries in the world database is: " + r); 
     } 

有可能你是想投nullint32

+0

不,問題是'長',因爲它是裝在一個'對象'裏面,它不能轉換目錄實際上到'int32'。 – Gusman

+0

@Gusman好的電話。 –

+0

'SELECT Count(*)'將始終返回一個long> = 0,從不是'null',任何錯誤都會拋出_Exception_ –

-1

幾個星期前我有同樣的問題。 問題是ExecuteScalar()返回長對象它不能被簡單地轉換爲int。但它可以鑄造然後到int

更改您代碼:

Int32 userCount = (Int32)checkUser.ExecuteScalar(); //error is here 

要:

int userCount = (int)(long)(checkUser.ExecuteScalar()); 

這個工作對我來說沒有任何問題。


順便說一句有完整的解決方案如何與參數應用工作:

using (MySqlCommand cmd = connection.CreateCommand()) 
{ 
    cmd.CommandText = "SELECT COUNT(*) FROM <MyCoolDatabase> WHERE Userid = @user"; 
    cmd.Parameters.AddWithValue("@user", username); 

    int userCount = (int)(long)(checkUser.ExecuteScalar()); 
    if (userCount > 0) 
    { 
     //work 
    } 
} 
+0

當然可以! 'ExecuteScalar'返回*任何*結果*包裹*作爲一個對象,你可以轉換爲適當的類型。如果您遇到問題,那是因爲返回類型是* not * int *。如果你試圖投入「長」,你可能不會有任何問題。很容易找到正確的類型 - 只需在調試器中檢查結果的內容 –

+0

換句話說 - 自從.NET 1.0推出以來,人們總是會投出ExecuteScalar()的結果。如果需要轉換爲字符串,有人會注意到這15年。 –

+0

但你明確地不能只寫'(int)ExecuteScalar()'正如你所說的,你必須先投射到很長的時間然後再到int。我已經更新了答案。 –