无法处理System.Data.SqlTypes.SqlNullValueException

时间:2012-11-27 07:12:43

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

我有以下代码:

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

请有人告诉我如何处理此例外。

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分: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;
}

答案 2 :(得分: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。这将解决你的错误: - )