【问题标题】:C# SQL - Loading a DataTable in DataGridView alters SQL query's dataC# SQL - 在 DataGridView 中加载 DataTable 会改变 SQL 查询的数据
【发布时间】:2016-07-16 06:40:57
【问题描述】:

我正在 C# 中为越野计时器项目制作 SQLite 查询生成器。它会根据您在 ComboBoxes 中选择的信息生成查询。

从我的项目一开始,我就一直在使用以下函数

private static DataTable ExecuteTableQuery(String query)
{
    DataTable dt = new DataTable();
    using (SQLiteCommand cmd = new SQLiteCommand(query, CONNECTION))
    {
        SQLiteDataReader reader = cmd.ExecuteReader();
        dt.Load(reader);
        return dt;
    }
}

为了设置我的 DataGridView 表单的数据源。

但是,我生成的查询越复杂,我就越会遇到奇怪的情况。

查询示例:

SELECT "No. Arrived", "Status", "Time", "Time Total", "No. Runner" // [A]
FROM (
    SELECT `Runner_no` AS "No. Runner", // Runner_no is a PK
           `Result_time` AS "Time",
           `Result_totaltime` AS "Time Total",
           `Result_status` AS "Status",
           `Result_registered` AS "No. Arrived" // Result_registered is a PK
           // [B]
    FROM `Result`, `Runner`, `City`
    WHERE `Runner_City_id` = `City_id` // City_id is a PK
        AND `Result_id` = `Runner_no`
        AND (`Runner_gender` = "F" OR `Runner_gender` = "M")
        AND (`Result_status` = "hurt" OR `Result_status` = "disq" OR `Result_status` = "OK" )

    UNION // Some people may have not reached the finish line.

    SELECT `Runner_no` AS "No. Runner",
           NULL AS "Time",
           NULL AS "Time Total",
           NULL AS "Status",
           NULL AS "No. Arrived"
    FROM `Result`, `Runner`, `City`
    WHERE `Runner_City_id` = `City_id`
        AND `Runner_no` NOT IN (SELECT `Result_id` FROM `Result` )
        AND (`Runner_gender` = "F" OR `Runner_gender` = "M" )
    GROUP BY "Runner_no"
)
ORDER BY "No. Arrived" ASC

请注意,我的应用程序用于生成可变 SQL 查询,因此我的示例看起来很简单是正常的。

我的问题: 大多数时候,(我认为)当我生成的查询在某些子句中包含主键时(例如在我的示例中),一些结果被省略,排序被忽略,有时,在 [A] 中选择另一行可以使查询再次工作。

在我的示例中:No. Arrived 列未排序,某些行消失,将列 City_id 添加到 [A] 和 [B] 可以解决所有问题。

NOTA BENE:我的应用程序生成的任何查询都没有任何错误。在任何外部 SQLite 软件(例如 http://sqlitebrowser.org/)中执行它们总是成功的。

我的问题:为什么当我在 DataTable 中加载数据时会发生这种情况?我怎样才能避免这种情况?如何在 C# 中获得与使用 SQLiteBrowser 等基于 c++ 的软件相同的结果?

【问题讨论】:

    标签: c# sql sqlite datagridview


    【解决方案1】:

    我得到了答案!谢谢您的帮助。 似乎(在我的情况下)我不能使用 SQLiteCommand,因为它会在读取时省略一些基本的 SQL 规则(不确定到底是哪种)以减少过热。

    对于像我这样的复杂查询,使用 SQLiteDataAdapter 可以正常工作。

    private static DataTable ExecuteTableQuery(String Query)
    {
        using (SQLiteDataAdapter adapter = new SQLiteDataAdapter(Query, CONNECTION))
        {
            DataTable dt = new DataTable();
            adapter.Fill(dt);
            return dt;
        }
    }
    

    【讨论】:

      【解决方案2】:

      我发现您的 union 语句中的列与 [A] 中的列不匹配

      SELECT `Runner_no` AS "No. Runner",
             NULL AS "Time",
             NULL AS "Time Total",
             NULL AS "Status",
             NULL AS "No. Arrived"
      

      自然吗?

      或者它可能是:

       SELECT  NULL AS "No. Arrived" ,
           NULL AS "Status",
           NULL AS "Time",
           NULL AS "Time Total",
          `Runner_no` AS "No. Runner"   
      

      ……

      如果你确定 sql 语句给你预期的结果,那么问题可能出在 DataTble 加载中:

      我建议:

      -给 DataTble 一个名字:

      DataTable dt = new DataTable("MyTable");

      在外部 SQL [A] 中使用不带空格或点的别名:

      SELECT "No. Arrived" as no_arrived , "Status", "Time", "Time Total" as time_total, "No. Runner" as no_runner -- [A]

      顺便说一句,如果在外部 sql [A] 中使用别名,则无需在内部 sql 中使用别名

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-05
        • 1970-01-01
        • 1970-01-01
        • 2014-11-21
        • 1970-01-01
        • 2019-07-20
        • 2018-11-28
        相关资源
        最近更新 更多