我正在使用Xamarin中的MySQL库连接到我的数据库。我正在调用ExecuteScalar()
命令来检查我的数据库中是否存在用户。
我将ExecuteScalar()
的返回值转换为Int32并存储在名为userCount
的Int32变量中,但当我尝试调用cast is not valid
时,Visual Studio会抛出(int32)checkUser.ExecuteScalar();
错误}
这是建议在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 :(得分:1)
您已关联到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);
}
您可能正在尝试将null
投射到int32
答案 1 :(得分:-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
}
}