SQLite内部连接问题

时间:2016-07-26 02:08:48

标签: c# sqlite datatable

我有两个表有一些奇怪的连接行为。这是一个包含数据的简要模式:

CREATE TABLE object(vnum INTEGER PRIMARY KEY, name TEXT);
CREATE TABLE object_affect(vnum INTEGER, apply_id INTEGER, modifier INTEGER);

object
vnum     name
10404    Test Item

object_affect
vnum     apply_id    modifier
10404    1           4
10404    5           2
10404    12          6

如果我运行以下查询,我应该返回3行,但它只返回1行。

select * from object o
    inner join object_affect oa on oa.vnum = o.vnum 
    where o.vnum = 10404

如果我将查询更改为此(将*更改为oa.vnum)..它将返回3行:

select oa.vnum from object o
    inner join object_affect oa on oa.vnum = o.vnum 
    where o.vnum = 10404

另外,如果我删除" PRIMARY KEY"在对象表的vnum字段的create table语句中标记第一个只返回1的查询1正确返回所有3个连接的行。

我缺少什么导致第一个查询不返回3行连接数据?

1 个答案:

答案 0 :(得分:0)

3.5年后,我再次遇到了这个问题。我想分享解决方案。这种情况下的想法是,DataTable用于在某种控件,DataGrid等上显示查询的结果。因此,它不需要DataTable试图从数据库推断出唯一性的约束。不能禁用对我自己发现的DataTable的约束的好方法,但是您可以将其与DataSet耦合并执行此操作。此代码段(假设已设置SqliteCommand)有效:

using (var dr = cmd.ExecuteReader())
{
    var dt = new DataTable();

    using (var ds = new DataSet() { EnforceConstraints = false })
    {
        ds.Tables.Add(dt);
        dt.BeginLoadData();
        dt.Load(dr);
        dt.EndLoadData();
        ds.Tables.Remove(dt);
    }
}

基本上,我们临时使用DataSet然后将其丢弃(将其从DataSet中删除很重要,这样DataSet才能进行处理并进行垃圾回收)。然后,您可以保留DataTable并将其持久化以将其绑定到控件。

相关问题