指定的强制转换无效 - System.InvalidCastException

时间:2016-04-07 22:34:32

标签: c# sql-server asp.net-mvc-5

我已经阅读了许多类似的问题并尝试了几种不同的方法,但我不明白为什么这不起作用。要求的列是int类型。我试过转换为uint和int32。我很欣赏方向。谢谢。

        int i = 1;
        int total=0;
        while (i < 7)
        {

            string conString = @"Data Source=UATDB2\sqleuat;Initial Catalog=CVNee;User ID=appuser;Integrated Security=true";

            SqlConnection connection = new SqlConnection(conString);
            connection.Open();
            SqlCommand cmd = connection.CreateCommand();
            cmd.CommandText = "SELECT SUM(AMOUNT) FROM TRANSACTIONS_DETAIL2 WHERE TRANSACTIONS_DETAIL2.TRANS_TYPE =" + i + "AND TRANSACTIONS_DETAIL2.HOH_UPI = '185292000'";

           int amt = ((int)cmd.ExecuteScalar());
            //amt = cmd.ExecuteScalar();

            if (i == 1)
            {
                total = total + amt;
            }

            if (i == 2)
            {
                total = total - amt;
            }

            if (i == 3)
            {
                total = total - amt;
            }

            if (i == 4)
            {
                total = total + amt;
            }

            if (i == 5)
            {
                total = total + amt;
            }

            if (i == 6)
            {
                total = total + amt;
            }

            connection.Close();
            ViewBag.TotalBalance = total;

            i++;
        }

2 个答案:

答案 0 :(得分:2)

ExecuteScalar返回null时,会发生非法播放异常。您可以在转换为null之前检查结果是否为int

 object o = cmd.ExecuteScalar();
 int result = o == null ? 0 : (int)o;

或者您可以使用可为空的int?,如果它有值,也可以检查

 int? result = (int?)cmd.ExecuteScalar();
 if (!result.HasValue) result = 0;

或者您可以调整查询以返回0,即使找不到匹配的行也是如此。 TSQL函数COALESCE检查第一个参数是否为NULL,否则返回该值,如果是,则返回第二个参数的值。

 string query = "SELECT COALESCE(SUM(AMOUNT),0) FROM TRANSACTIONS_DETAIL2 WHERE TRANSACTIONS_DETAIL2.TRANS_TYPE =" + i + "AND TRANSACTIONS_DETAIL2.HOH_UPI = '185292000'";

答案 1 :(得分:1)

根据您的评论

如果您致电ExecuteScalar,可能会得到nullDBNull作为回报,您应该同时检查两者。您可以先将其填入object类型的变量中,然后检查DBNull.Valuenull并对此做出反应:

int amt=0;
object amtUnchecked = cmd.ExecuteScalar();
if(amtUnchecked != DBNull.Value && amtUnchecked!=null)
    amt=(int)amtUnchecked;

或者您更改SELECT以返回确定的零:SELECT ISNULL(SUM(AMOUNT),0) ...