C# C SQL-在DataGridView中加载DataTable会更改SQL查询的数据

C# C SQL-在DataGridView中加载DataTable会更改SQL查询的数据,c#,sql,sqlite,datagridview,C#,Sql,Sqlite,Datagridview,我正在用C语言为一个跨国计时器项目制作一个SQLite查询生成器。它根据您在组合框中选择的信息生成查询 从我的项目一开始,我就一直在使用以下函数 private static DataTable ExecuteTableQuery(String query) { DataTable dt = new DataTable(); using (SQLiteCommand cmd = new SQLiteCommand(query, CONNECTION)) {

我正在用C语言为一个跨国计时器项目制作一个SQLite查询生成器。它根据您在组合框中选择的信息生成查询

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

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.Arrized列没有被排序,一些行消失,将列City_id添加到[A]和[B]中解决了所有问题

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


我的问题:为什么在数据表中加载数据时会发生这种情况?我怎样才能避免这种情况?我怎样才能得到与SQLiteBrowser一样的基于C++的软件的结果?

< p>我发现你的联合声明中的列与[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加载中:

我建议:

-为数据文件指定一个名称:

DataTable dt=新DataTableMyTable

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

选择No.Arrized作为No_Arrized,状态、时间、时间总计作为Time_Total,No.Runner作为No_Runner-[A]


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

我得到了答案!谢谢你的帮助。 在我的例子中,似乎无法使用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;
    }
}