2010-01-07 74 views
0

当我在我的移动应用程序中运行此SQl时,我得到零行。SqlCe奇怪的结果为什么? - 相同的SQL,不同应用程序中的结果不同。问题与

select * from inventory WHERE [ITEMNUM] LIKE 'PUMP%' AND [LOCATION] = 'GARAGE' 

当我使用相同的数据库在查询分析器3.5中运行相同的SQL时,我得到了我预期的一行。

为什么区别?

这里是我使用的移动应用程序的代码:

SqlCeCommand cmd = new SqlCeCommand(Query); 
cmd.Connection = new SqlCeConnection("Data Source="+filePath+";Persist Security Info=False;"); 
DataTable tmpTable = new DataTable(); 
cmd.Connection.Open(); 
SqlCeDataReader tmpRdr = cmd.ExecuteReader(); 
if (tmpRdr.Read()) 
    tmpTable.Load(tmpRdr); 
tmpRdr.Close(); 
cmd.Connection.Close(); 
return tmpTable; 

UPDATE: 对于想我以前的答案中的一个找到的代码着想发现here和它的作品作为预期。所以我的代码如下所示:

SqlCeConnection conn = new SqlCeConnection("Data Source=" + filePath + ";Persist Security Info=False;"); 
DataTable tmpTable = new DataTable(); 
SqlCeDataAdapter AD = new SqlCeDataAdapter(Query, conn); 
AD.Fill(tmpTable); 

该问题似乎与SqlCeDataReader一起出现。

希望这可以帮助别人!

回答

1

难道是您用来查看结果集中是否有行的检查吗?

如果有任何行,则方法tmpRdr.Read()会将游标移至结果集中的第一行。然后,当您执行tmpTable.Load时,可能会从该位置开始加载数据表,并导致第一个(也是唯一的?)行被跳过。

您可以通过删除行if (tmpRdr.Read())来轻松检查,因为在这里没有必要。即使结果集为空,Load方法也不会失败,并且在两种情况下最终都会生成一个空数据表。唯一的区别是,如果删除if语句,您将获得设置的列。

+0

这对于我所得到的结果来说是完美无缺的......或者说没有得到。我会尽力去看看会发生什么。 – NitroxDM

+0

就是这样。谢谢! – NitroxDM

0

我同意符文 - 你应该忽略

if (tmpRdr.Read()) 

如果你绝对要检查,如果你得到一个行作为执行的结果,你最好使用此代码:

if (tmpRdr.HasRows) 
相关问题