无法处理 System.Data.SqlTypes.SqlNullValueException



我有以下代码:

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---*}

如何处理此异常?

不需要时不要捕获异常。 执行此操作的正确方法是在调用sdr.GetString(0)之前测试sdr.IsDBNull(0)。 如果IsDBNull()返回 true,则GetString()将引发异常,您不应调用它。

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

最好像这样用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;
}

你会得到一个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

特别 提款 权。IsDBNull(0) 将检查您要读取的值是否为 NULL。这将修复您的错误:-)

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

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

其中X是数据库的别名或行名的名称,a是要将读取器链接到的对象。

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

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

最新更新