【问题标题】:SqlCe odd results why? -- Same SQL, different results in different apps. Issue withSqlCe为什么会出现奇怪的结果? -- 相同的 SQL,在不同的应用程序中产生不同的结果。问题
【发布时间】:2010-01-07 07:18:18
【问题描述】:

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

希望这对其他人有所帮助!

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 这对我得到的结果非常有意义......或者更确切地说没有得到。我会试一试,看看会发生什么。
    【解决方案2】:

    我同意符文 - 你应该省略

    if (tmpRdr.Read())
    

    如果您绝对想检查执行结果是否得到一行,您最好使用以下代码:

    if (tmpRdr.HasRows)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多