6

我有以下代码:

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

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

4

4 回答 4

9

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

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

于 2012-11-27T07:17:09.547 回答
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;
}
于 2012-11-27T07:15:46.017 回答
1

你得到一个 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。这将解决您的错误:-)

于 2014-03-24T17:12:31.133 回答
0

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

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

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

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

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

于 2021-09-08T00:17:49.743 回答