如果从数据库返回的字符串为null或为空,如何避免异常?

时间:2015-03-20 16:57:00

标签: c# string null base64

我有一个业务规则,其中字符串需要转换为Base64。

执行存储过程的方法可能返回有效的字符串或空字符串,例如:

public static string GetReturnString()
{
     ...
     try
     {
        con.Open();
        myString = cmd.ExecuteScalar().ToString();
        return myString;
     }
     catch{Exception ex)
     {
        InsertErrorInDB(....);
        return null;
     }
     finally
     {
        con.Close();
        cmd.Close();
     }
}

然后,我有一个方法调用上面的方法:

public string GetCode() 
{
   string myString = GetReturnString();
   ConvertToBase64String(myString); // this method will have an exception if myString is null
   .....

}

如果我添加支票:

if(myString != null || myString.Length !=0)
{
    ConvertToBase64String(myString);   
} 

,我不会有错误,但是如何确保myString永远不会为null,所以这段代码总会执行?

如果myString没有通过验证条件并且实际上是null,我可以写什么?

我可以再次尝试从数据库中检索它吗?还有其他方法可以实现吗?

谢谢

1 个答案:

答案 0 :(得分:4)

DBNull.ToString()已经返回String.Empty()。您可以在异常处理程序中执行相同的操作:

public static string GetReturnString()
{
     ...
     try
     {
        con.Open();
        return cmd.ExecuteScalar().ToString();
     }
     catch{Exception ex)
     {
        InsertErrorInDB(....);
        return string.Empty;
     }
     finally
     {
        con.Close();
        cmd.Close();
     }
}

这最不简化您的测试:

if(myString != string.Empty)
{
    myString = ConvertToBase64String(myString);   
}

另请注意,我必须分配回原件。如果你不这样做,你将丢弃函数调用的结果。

根据所提供的内容,这与我可以得到的问题尽可能接近。对于其余部分,我们需要更多的上下文,并且有很多方法可以处理这个问题,因为世界上有程序员。

当我在这里时,让我补充一点,重新使用相同的连接对象,就像你似乎使用con变量一样,这对于ADO.Net来说是不好的做法。对于大多数每次调用数据库而言,最好为每次调用创建一个新的连接对象,而只是重复使用相同的连接字符串。