【问题标题】:Unable to handle System.Data.SqlTypes.SqlNullValueException无法处理 System.Data.SqlTypes.SqlNullValueException
【发布时间】:2012-11-14 18:32:36
【问题描述】:

我有以下代码:

public string getFinalCon(string desid)
        {
            string finalConId = null;
            try
            {
                query = "select finalConID from discussions where desid=@did";
                com = new SqlCommand(query, con);
                com.Parameters.AddWithValue("@did", desid);
                con.Open();
                sdr = com.ExecuteReader();
                while (sdr.Read())
                {
                    if (sdr.GetString(0).Equals("none") == false && sdr.GetString(0)!=null)
                    {
                        finalConId = sdr.GetString(0);
                        break;
                    }
                }
                con.Close();
            }
            catch (Exception)
            {
            }
            return finalConId;
        }

如您所见,我正在捕获“异常”,即全局异常。但是问题是,每当执行finalConId=sdr.GetString(0)这行代码时,系统就会抛出System.Data.SqlTypes.SqlNullValueException。是的,只要数据库中相应字段的值为 NULL,它肯定会抛出它。但我想要的是这个异常应该被 catch 块捕获,并且函数应该返回 finalConId 的默认值,即函数启动时声明的 NULL。但这并没有发生,而是显示了我的错误页面。我这样调用这个函数:

string conid = getFinalCon(Request["id"].ToString());

if (conid == null)
{ /*---some code---*/}
else
{/*---some code---*}

请任何人告诉我如何处理此异常。

【问题讨论】:

    标签: c# asp.net sql-server-2008 null sqlexception


    【解决方案1】:

    不要在不需要时捕获异常。正确的方法是在调用sdr.GetString(0) 之前测试sdr.IsDBNull(0)。如果IsDBNull()返回true,那么GetString()会抛出异常,你不应该调用它。

    在不指出某种错误的情况下吞下所有异常也是非常糟糕的做法。几乎在所有情况下都应避免使用catch { }catch (Exception) { }。如果发生灾难性事件(例如,数据库连接断开),您希望允许该异常传播。否则,调用者如何区分“该列中的空值”和“数据库连接死亡”的情况?

    【讨论】:

    • 谢谢它的工作,我想问的另一件事。我们如何预测会发生什么异常?因此,我使用异常类来捕获异常。我之前也是按照你说的做的。但这让我很恼火,因为持续的异常,所以我只是去捕捉“异常”异常。
    • 如果您遇到异常,那么您需要找出原因。正如我所说,忽略异常是非常糟糕的做法。需要调查异常,而不是忽略。
    【解决方案2】:

    最好用 DBNull.Value 或 IsDBNull() 像这样检查值

    if (reader.IsDBNull(0) && sdr.GetString(0).Equals("none") == false)
              //sdr.GetString(0)!=DBNull.Value)
    

    如果你想在异常时返回null而不是这样

    string conid;
    try
    {
      conid = getFinalCon(Request["id"].ToString());
    }
    Catch(Exception ex)
    {
      conid =null;
    }
    

    【讨论】:

    • 在尝试您的代码时遇到以下错误 => 运算符 '!=' 不能应用于类型为 'string' 和 'System.DBNull' 的操作数
    【解决方案3】:

    你得到一个 System.Data.SqlTypes.SqlNullValueException 因为程序试图从数据库中读取一些东西是 NULL。您可以通过在阅读之前检查该值是否为 NULL 来解决此问题。

    试试下面的代码:

    query = "select finalConID from discussions where desid=@did";
    com = new SqlCommand(query, con);
    com.Parameters.AddWithValue("@did", desid);
    con.Open();
    sdr = com.ExecuteReader();
    while (sdr.Read())
    {
        if (sdr.GetString(0).Equals("none") == false && !sdr.IsDBNull(0) )
        {
            finalConId = sdr.GetString(0);
            break;
        }
    }
    con.Close();
    enter code here
    

    sdr.IsDBNull(0) 将检查您要读取的值是否为 NULL。这将解决您的错误:-)

    【讨论】:

      【解决方案4】:

      您可以在“while”循环中使用以下结构(考虑您是否使用基于 ADO 连接的数据访问层)。

                      if (reader["X"]is DBNull)
                      { a = "N/A";}
                      else
                      { a = reader.GetString(reader.GetOrdinal("X")); }
                      
                      
      

      其中X 是您的数据库的别名或行名,a 是您将该阅读器链接到的对象。

      要考虑的一件事,在我的示例中,X 是一个字符串。

      如您所见,您正在处理特定的 Null 引用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-07
        • 2020-02-26
        • 2020-07-01
        • 1970-01-01
        • 2015-01-22
        • 2020-12-01
        • 2013-12-23
        相关资源
        最近更新 更多