Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQLite内部连接问题_C#_Sqlite_Datatable - Fatal编程技术网

C# SQLite内部连接问题

C# SQLite内部连接问题,c#,sqlite,datatable,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 modifi

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

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
如果我将查询更改为this(将*更改为oa.vnum)。。它返回3行:

select oa.vnum from object o
    inner join object_affect oa on oa.vnum = o.vnum 
    where o.vnum = 10404
另外,如果我从对象表上的vnum字段中删除create table语句中的“PRIMARY KEY”标志,则仅返回一个1的第一个查询将正确返回所有3个连接行


我遗漏了什么导致第一个查询不返回3行关联数据?

我在3.5年后再次遇到这个问题。我想分享解决方案。这种情况下的想法是,DataTable用于显示某种控件、DataGrid等的查询结果。因此,它不需要DataTable试图从数据库中推断出的关于唯一键的约束,等等。没有什么好方法可以禁用我自己发现的DataTable上的约束,但是您可以将其与数据集结合起来,这样做。此代码段(假设SQLITE命令已设置)可以工作:


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

3.5年后,我再次遇到了这个问题。我想分享解决方案。这种情况下的想法是,DataTable用于显示某种控件、DataGrid等的查询结果。因此,它不需要DataTable试图从数据库中推断出的关于唯一键的约束,等等。没有什么好方法可以禁用我自己发现的DataTable上的约束,但是您可以将其与数据集结合起来,这样做。此代码段(假设SQLITE命令已设置)可以工作:


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

我从两个查询中获得3条记录,至少在MySQL()中是这样。返回的是哪条记录?。您使用的是最新的SQLite版本吗?数据库是用C程序中的SQLite 3创建的。正在通过SQLite ADO.Net提供程序查询数据。我希望看到返回三行(左表中的一行与右表中的三行合并)。也不知道为什么仅仅删除vnum的主键就会改变查询结果。这是一件非常奇怪的事情。如果我是你,我只会使用join版本,它会给你你所期望的。也许其他人可以破解这个问题(我不能,因为我无法重现它)。我从两个查询中都得到了3条记录,至少在MySQL()中。返回了哪条记录?。您使用的是最新的SQLite版本吗?数据库是用C程序中的SQLite 3创建的。正在通过SQLite ADO.Net提供程序查询数据。我希望看到返回三行(左表中的一行与右表中的三行合并)。也不知道为什么仅仅删除vnum的主键就会改变查询结果。这是一件非常奇怪的事情。如果我是你,我只会使用join版本,它会给你你所期望的。也许其他人能解决这个问题(我不能,因为我不能重现它)。
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);
    }
}