DBNull错误即将出现

Mat*_*ics 0 c# sql asp.net

我有一个数据库表

FruitCrateTable FruitCrateID, FruitCrateName, FruitGarden
Run Code Online (Sandbox Code Playgroud)

现在我还创建了一个存储过程,

CREATE procedure [dbo].[GetFruitCrate]
(
    @FruitCrateID int,
    @FruitCrateName varchar(222)
)
AS

SELECT 
    *
FROM 
    FruitCrateTable
WHERE
    FruitCrateID = @FruitCrateID
and
    FruitCrateName = @FruitCrateName 
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试使用DataAccess检查FruitGarden是否为null时,

我创建了row的实例,

 public myDataAccess.DataAccess.GetFruitCrateRow fruitCrateRow;
 //then

 if (!string.IsNullOrEmpty(fruitCrateRow.FruitGarden))
            {
//do something but i am getting error, how can i fix this issue ?
else { // do something else }
Run Code Online (Sandbox Code Playgroud)

错误,

The value for column &#39;FruitGarden&#39; in table &#39;GetFruitCrate&#39; is DBNull.</message><full>System.Data.StrongTypingException: The value for column &#39;FruitGarden&#39; in table &#39;GetFruitCrate&#39; is DBNull. ---&gt; System.InvalidCastException: Unable to cast object of type &#39;System.DBNull&#39; to type &#39;System.String&#39;.
Run Code Online (Sandbox Code Playgroud)

我离开了Fruit Garden,因为它可以为null

更新

当我尝试fruitCrateRow.FruitGarden!= DBNull.Value我得到Error Operator'!='不能应用于'string'和'System.DBNull类型的操作数

Rap*_*aus 6

好吧,如异常所述,fuitCraterow.FruitGardenDBNull,它不能被转换为字符串(当你打电话时会发生string.IsNullOrEmpty)

所以...测试 DbNull

if (!DBNull.Value.Equals(fruitCrateRow.FruitGarden) && 
   !string.IsNullOrEmpty(fruitCraterow.FruitGarden))
Run Code Online (Sandbox Code Playgroud)

要检查DbNull,请参阅msdn

要评估数据库字段以确定它们的值是否为DBNull,可以将字段值传递给DBNull.Value.Equals方法.但是,很少使用此方法,因为有许多其他方法可以评估数据库字段中是否存在缺失数据.这些包括Visual Basic IsDBNull函数,Convert.IsDBNull方法,DataTableReader.IsDBNull方法,IDataRecord.IsDBNull方法以及其他几种方法.

所以

if (!Convert.IsDBNull(fruitCrateRow.FruitGarden) && 
     !string.IsNullOrEmpty(fruitCrateRow.FruitGarden)
Run Code Online (Sandbox Code Playgroud)

也应该没事.

编辑

您仍然可以string.IsNullOrEmpty在DBNull测试后添加测试,因为只有当左侧部分为true时才会对其进行评估.