当我在移动应用程序中运行此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有关。
希望这可以帮助其他人!
答案 0 :(得分:1)
可能是您用来查看结果集中是否有行的检查?
如果有任何行,方法tmpRdr.Read()
会将光标移动到结果集中的第一行。然后当你执行tmpTable.Load
时,可能是从该位置开始加载数据表,从而导致跳过第一行(也是唯一的?)。
您可以通过删除第if (tmpRdr.Read())
行来轻松检查,因为这里没有必要。即使结果集为空,Load
方法也不会失败,并且在这两种情况下最终都会得到一个空数据表。唯一的区别是,如果删除if语句,将设置列。
答案 1 :(得分:0)
我同意符文 - 你应该省略
if (tmpRdr.Read())
如果您绝对想要检查是否因执行而获得了一行,您最好使用此代码:
if (tmpRdr.HasRows)