C# C SQL-在DataGridView中加载DataTable会更改SQL查询的数据
我正在用C语言为一个跨国计时器项目制作一个SQLite查询生成器。它根据您在组合框中选择的信息生成查询 从我的项目一开始,我就一直在使用以下函数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)) {
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;
}
}