【问题标题】:need to handle NULL exception需要处理 NULL 异常
【发布时间】:2014-01-17 05:13:11
【问题描述】:
private int MyTimeValue()
{
    int Value = 0;
    string connectionString = GetConfigurationSettingValue("ConnectionString");
    int Days = 120;

    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        using (SqlCommand cmd = new SqlCommand("select [dbo].[My_function] (@Span)", connection))
        {
            cmd.CommandType = System.Data.CommandType.Text;

            cmd.Parameters.Add(new SqlParameter("@Span", Days));

            Value = Convert.ToInt32(cmd.ExecuteScalar());

        }
    }

    return (Value);
}

我收到Object cannot be cast from DBNull to other types.

如何在这里使用trycatch 处理空异常

请帮我语法。

【问题讨论】:

标签: c# asp.net null


【解决方案1】:

你可以在转换前验证

object result = cmd.ExecuteScalar();
if(result != null)
    Value = Convert.ToInt32(result);

并添加如下参数

 cmd.Parameters.AddWithValue("@Span", Days);

作为旁注,cmd.CommandType = System.Data.CommandType.Text; 行是不需要的。默认命令类型是文本

【讨论】:

    【解决方案2】:

    我猜错误在这里:

    Value = Convert.ToInt32(cmd.ExecuteScalar());
    

    试试这个:

    var result = cmd.ExecuteScalar();
    Value = result == DBNull.Value ? 0 : Convert.ToInt32(result);
    

    注意:你的命令字符串在我看来也是错误的。

    【讨论】:

    • 这会调用 ExecuteScalar() 两次。
    • @Selman22 你编辑过你的回答吗?哪一种是最好的方法?
    【解决方案3】:

    您需要先检查ExecuteScalar返回的值是否为null,以便在尝试将对象强制转换为Int32时不会发生异常。

    private int MyTimeValue()
        {
            int Value = 0;
            string connectionString = GetConfigurationSettingValue("ConnectionString");
            int Days = 120;
    
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();
                using (SqlCommand cmd = new SqlCommand("select [dbo].[My_function] (@Span)", connection))
                {
                    cmd.CommandType = System.Data.CommandType.Text;
    
                    cmd.Parameters.Add(new SqlParameter("@Span", Days));
                    object o=cmd.ExecuteScalar();
                    if(o!=null)
                       Value = Convert.ToInt32(o);
    
                }
            }
    
            return (Value);
    
        }
    

    【讨论】:

      【解决方案4】:

      这可以通过两种方式完成。

      案例一:处理特定异常

      private int MyTimeValue()
      {
          int Value = 0;
          try
          {      
             string connectionString = GetConfigurationSettingValue("ConnectionString");
             int Days = 120;
      
             using (SqlConnection connection = new SqlConnection(connectionString))
             {
                 connection.Open();
                 using (SqlCommand cmd = new SqlCommand("select [dbo].[My_function] (@Span)", connection))
                 {
                     cmd.CommandType = System.Data.CommandType.Text;
      
                     cmd.Parameters.Add(new SqlParameter("@Span", Days));
      
                     Value = Convert.ToInt32(cmd.ExecuteScalar());
      
                 }
             }
           catch(NullReferenceException ex)
           {
              \\Handle Exception
           }
      
           return (Value);
      
      }
      

      案例 2:检查 Null 变量并捕获其他意外异常的一般异常

          private int MyTimeValue()
      {
          int Value = 0;
          try
          {      
             string connectionString = GetConfigurationSettingValue("ConnectionString");
             int Days = 120;
      
             using (SqlConnection connection = new SqlConnection(connectionString))
             {
                 connection.Open();
                 using (SqlCommand cmd = new SqlCommand("select [dbo].[My_function] (@Span)", connection))
                 {
                     cmd.CommandType = System.Data.CommandType.Text;
      
                     cmd.Parameters.Add(new SqlParameter("@Span", Days));
                     var result = cmd.ExecuteScalar();
                     if(result !=null)
                          Value = Convert.ToInt32(result );
      
                 }
             }
           catch(Exception ex)
           {
              \\For handling unexpected exceptions
           }   
           return (Value);
      }
      

      【讨论】:

      • 这是最好的方法吗?如果NULL 这将返回0
      • @ashuthinks 不,这不是最好的方法,因为它不是特殊情况(即您希望有时值会为空),并且处理所有异常类型并增大 @ 是一个坏主意987654325@也屏蔽了。
      • 你不应该依赖一般的例外。相反,您应该处理特定的异常。如果您在使用之前验证变量更好,尤其是如果它们来自您的函数之外。
      • 是的。我刚刚更新了问题。你可以你以上任何一种情况。如果它是您的问题,您可以接受该答案。 :)
      • if(DBNull.Value!=null) 什么? :p
      【解决方案5】:

      试试这个

                Value = cmd.ExecuteScalar();    
                if (((Value != null) || (Value != DBNull.Value)))
                {
                Value =(int)Value ;
                }
      

      【讨论】:

        猜你喜欢
        • 2012-11-16
        • 1970-01-01
        • 2012-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-29
        • 1970-01-01
        • 2015-05-10
        相关资源
        最近更新 更多