C# 需要处理空异常

C# 需要处理空异常,c#,asp.net,null,C#,Asp.net,Null,我得到的对象无法从DBNull转换为其他类型。 如何使用try和catch 请帮助我了解语法。我猜错误在这里: private int MyTimeValue() { int Value = 0; string connectionString = GetConfigurationSettingValue("ConnectionString"); int Days = 120; using (SqlConnection connection = new SqlC

我得到的
对象无法从DBNull转换为其他类型。

如何使用
try
catch


请帮助我了解语法。

我猜错误在这里:

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);
}
试试这个:

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

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

这可以通过两种方式完成

案例1:处理特定异常

var result = cmd.ExecuteScalar();
Value = result == DBNull.Value ? 0 : Convert.ToInt32(result);
案例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));

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

           }
       }
     catch(NullReferenceException ex)
     {
        \\Handle Exception
     }

     return (Value);

}

您可以在转换之前进行验证

    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);
}
并添加如下参数

object result = cmd.ExecuteScalar();
if(result != null)
    Value = Convert.ToInt32(result);
作为旁注,行
cmd.CommandType=System.Data.CommandType.Text是没有必要的。默认命令类型为Text

请尝试以下操作

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

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

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

此调用可能重复两次ExecuteScalar()。@Selman22是否编辑了ans?哪一个是最好的方法?这是最好的方法吗?如果
NULL
将返回一个
0
@ashuthinks否,这不是最好的方法,因为这不是异常情况(即,您期望有时值将为NULL),处理所有异常类型并创建大型
try
块也是一个坏主意。您不应该依赖于常规异常。相反,您应该处理特定的异常。如果在使用变量之前验证变量会更好,尤其是当变量来自函数外部时。是的。我刚刚更新了问题。你可以选择上述任何一种情况。如果这是你的问题的答案,你可以接受这个答案。:)<代码>如果(DBNull.Value!=null)
什么?:P
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);

    }