SqlCe奇怪的结果为什么? - 相同的SQL,不同的应用程序中的不同结果。问题

时间:2010-01-07 07:18:19

标签: .net sql compact-framework sql-server-ce

当我在移动应用程序中运行此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;

更新: 为了尝试,我使用了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有关。

希望这可以帮助其他人!

2 个答案:

答案 0 :(得分:1)

可能是您用来查看结果集中是否有行的检查?

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

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

答案 1 :(得分:0)

我同意符文 - 你应该省略

if (tmpRdr.Read())

如果您绝对想要检查是否因执行而获得了一行,您最好使用此代码:

if (tmpRdr.HasRows)