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

4 回答 4

5

cmd1.ExecuteScalar()没有返回一个装箱的整数。将它分配给一个对象并在调试器中查看它以了解它的真正含义。

我猜它会返回一个小数或双精度,你需要这样做:

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

或者:

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

[编辑回应以下评论中的问题]

要保留十进制值,只需执行以下操作:

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

如果需要,您可以将小数转换为双精度:

double result = (double)(Decimal) cmd1.ExectuteScalar();
于 2013-02-18T19:57:56.740 回答
1

结果不是Int32,基本上。你正在投射它Decimal(12, 2)- 所以我不确定你为什么期望它。

我的猜测是它要么是 adouble要么是decimal- 但如果你将调用与演员分开并查看调试器,它应该是显而易见的:

object result = cmd1.ExecuteScalar();
// Now look at the type of the value of result
于 2013-02-18T19:59:18.940 回答
1

你的结果很Int32明显,所以你可以使用它;

var result = cmd1.ExecuteScalar();

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

object result = cmd1.ExecuteScalar();

也许你可以施放它。请记住,您可以轻松地在调试器中查看它。

于 2013-02-18T20:01:13.470 回答
0

您在 SQL 中将值转换为小数,因此请尝试在您的 c# 代码中将值转换为小数。

于 2013-02-18T19:58:43.163 回答