我有一个数据库表
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 'FruitGarden' in table 'GetFruitCrate' is DBNull.</message><full>System.Data.StrongTypingException: The value for column 'FruitGarden' in table 'GetFruitCrate' is DBNull. ---> System.InvalidCastException: Unable to cast object of type 'System.DBNull' to type 'System.String'.
Run Code Online (Sandbox Code Playgroud)
我离开了Fruit Garden,因为它可以为null
更新
当我尝试fruitCrateRow.FruitGarden!= DBNull.Value我得到Error Operator'!='不能应用于'string'和'System.DBNull类型的操作数
好吧,如异常所述,fuitCraterow.FruitGarden是DBNull,它不能被转换为字符串(当你打电话时会发生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时才会对其进行评估.