问题描述
private int GetCombinedRankRank(int combinedRankValue)
{
try
{
conn = new MysqLConnection(connstr);
conn.open();
try
{
DataTable dtStates = new DataTable();
MysqLCommand comm = conn.CreateCommand();
comm.CommandText = "SELECT COUNT(states_id) "+
"FROM states "+
"WHERE combinedRank < @combinedRankValue";
comm.Parameters.AddWithValue("@combinedRankValue",combinedRankValue);
return (int)comm.ExecuteScalar();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
throw;
}
}
finally
{
conn.Close();
}
}
...在行上失败:
return (int)comm.ExecuteScalar();
...带有“指定的强制类型转换无效”-但是,相同的sql在Database Workbench中也可以工作:
sql返回一个整数。表中CombinedRank列的数据类型为Integer。我正在将该值转换为整数。怎么可能是无效的演员?
解决方法
这是我之前遇到的东西,所以我可以花掉两美分:
在comm.ExecuteScalar()
的情况下,long
将返回MySqlCommand
。您可以通过打印typeof cmd.ExecuteScalar()
来检查是否为真。它应该返回long
。如果是这样,正确的类型转换方法如下:
return (long)comm.ExecuteScalar();
这应该避免任何数据丢失。但是,当我查看mysql连接器(https://dev.mysql.com/doc/connector-net/en/connector-net-tutorials-sql-command.html)给出的示例时,它们使用的是以下内容:
string sql = "SELECT COUNT(*) FROM Country";
MySqlCommand cmd = new MySqlCommand(sql,conn);
object result = cmd.ExecuteScalar();
if (result != null)
{
int r = Convert.ToInt32(result);
Console.WriteLine("Number of countries in the world database is: " + r);
}
他们使用Convert.ToInt32
并检查对象是否为空,我认为这是处理情况的正确方法。如果返回类型为long
,则可能将其更改为long
:
MySQL COUNT()
将返回BIGINT
(The return type of the COUNT() function is BIGINT.)将C#将其转换为Int64
数据类型,但它将由ExecuteScalar()
作为{{ 1}}。
如果object
返回为ExecuteScalar()
,则Int64
将起作用。一个很好的答案可以追溯到Better way to cast object to int。
要解决此问题,可以使用以下选项。
-
(int)comm.ExecuteScalar()
-
return (int)(Int64)comm.ExecuteScalar();
-
return int.Parse(comm.ExecuteScalar().ToString());
尝试一下。
return Convert.ToInt32(cmd.ExecuteScalar());