【发布时间】: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