使用C#时出现“指定的转换无效”错误

3

我正在尝试将一个select语句的结果存储在C#变量中,但是出现了以下错误:

"指定的转换无效"

运行时遇到了这个错误。我不确定该如何解决,请帮忙。

SqlConnection con1 = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString);

        SqlCommand cmd1 = new SqlCommand("select cast(round(sum(CAST(AvgNumbers AS numeric(12,2))),2) as decimal(12,2)) AS [Average Days] from MainTable ", con1);

        cmd1.Connection = con1;
        con1.Open();
        Int32 result = (Int32)cmd1.ExecuteScalar();
        con1.Close();
4个回答

5

cmd1.ExecuteScalar()没有返回一个封装的整数。将其赋给一个对象并在调试器中查看它的真实类型。

我猜它会返回一个Decimal或者double类型,你需要这样做:

Int32 result = (Int32)(double)cmd1.ExecuteScalar();

或者:

Int32 result = (Int32)(Decimal)cmd1.ExecuteScalar();

要保留小数值,只需这样做:

Decimal result = (Decimal) cmd1.ExecuteScalar();

如果需要的话,您可以将十进制数转换为双精度浮点数:

double result = (double)(Decimal) cmd1.ExectuteScalar();

谢谢Mathew,你的第二种方法非常好用,但我期望得到的是27.81这个数字,而现在只得到了27。有没有办法能够显示小数点后面的数字呢?谢谢。 - moe
问题不在于你不能将十进制数转换为整数,而在于你不能将装箱的十进制数转换为整数。 - Despertar
整数定义上不会有小数位。在你的情况中,解决方法是使用十进制。我将编辑我的答案以示范。 - Matthew Watson

1
结果基本上不是一个Int32。你正在将其转换为Decimal(12, 2) - 所以我不确定你为什么会期望它是这样的。
我的猜测是它可能是double或decimal - 但如果你将调用与转换分开并在调试器中查看,应该很明显:
object result = cmd1.ExecuteScalar();
// Now look at the type of the value of result

1

你的结果显然不是一个 Int32,因此你可以使用它;

var result = cmd1.ExecuteScalar();

然后,您可以检查它是哪种类型。或者使用;

object result = cmd1.ExecuteScalar();

也许你可以执行它。只需记住,你可以在调试器中轻松查看它。

0

您正在将值在 SQL 中强制转换为十进制数,因此请尝试在 C# 代码中进行十进制转换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接