0

用下面的代码:如何判断我的SqlCeDataReader在调用SqlCeCommand.ExecuteReader()后是否包含任何vals?

SqlCeDataReader myReader = cmd.ExecuteReader(CommandBehavior.SingleRow); 
itemID = myReader.GetString(0); 
packSize = myReader.GetString(1); 

...我得到一个例外,“没有数据存在行/列”我希望它静静地“中止”,而不是抛出异常

这个案例。尝试分配前有没有办法先测试?

我尝试这样做,但它确实没有好:

SqlCeDataReader myReader = cmd.ExecuteReader(CommandBehavior.SingleRow); 
if (null != myReader.GetString(0)) 
{ 
    itemID = myReader.GetString(0); 
} 
if (null != myReader.GetString(1)) 
{ 
    packSize = myReader.GetString(1); 
} 

另一种可能是把它包起来在一条try..catch和“吃”的例外,但我不知道如果是这样的最好的方式去...

+1

这是基于我的SqlDataReader'的'知识,而不是' SqlCeDataReader',但在前一种情况下,您必须先“读取()”第一条记录。假(0)返回表示不再有记录。 –

+0

谢谢;我曾经假定调用ExecuteReader去了一切。因此,我添加了“if(myReader.Read()){}”使您的评论成为答案,并将其标记为*答案。 –

+0

感谢您的提议。正如我所建议的,我的回答只是一个猜测,这就是为什么我把它放在评论中而不是答案中。此外,我喜欢@ MD.Unicorn对哈斯罗斯的额外支票,这已经让我不知所措。 –

回答

4

这是因为你在取得DataReader后没有拨打Read()方法。这并不意味着结果不包含任何数据。这意味着不包含任何数据。

using (SqlCeDataReader myReader = cmd.ExecuteReader(CommandBehavior.SingleRow)) 
{ 
    if (myReader.Read()) // It returns `false` if there is no data 
    { 
     itemID = myReader.GetString(0); 
     packSize = myReader.GetString(1); 
    } 
} 

如果结果可以包含多个行,你要检查,看看是否结果中包含的任何数据,使用HasRows

using (SqlCeDataReader myReader = cmd.ExecuteReader()) 
{ 
    if (myReader.HasRows) 
    { 
     while (myReader.Read()) 
     { 
      // read values from `myReader` 
     } 
    } 
} 
+0

+1。对于单行,你可能只用'if(myReader.Read()){...}'就可以逃脱。 – JosephHirn

+0

@Ginosaji哦!当然!我没有看'CommandBehavior.SingleRow',我认为它可能有多行! –

+0

谢谢;如果BK没有回答我已经实施的答案,我会将其标记为这样(即使我怀疑马里兰州真的存在独角兽)。 –

相关问题