C#Sqlite使用DataTable抛出ConstraintException

时间:2014-02-27 07:31:04

标签: c# sqlite datatable mono

我使用C#/ Mono访问Sqlite数据库。

以下查询在任何数据库应用程序中都可以正常工作,但是当我尝试加载结果时,DataTable一直在抱怨。

这是一个片段

    cmd.CommandText = @"SELECT 
                          sectors.name AS sector_name,
                          domains.name AS domain_name
                        FROM
                          sectors_domains
                          INNER JOIN domains ON (sectors_domains.domain = domains.id)
                          INNER JOIN sectors ON (sectors_domains.sector = sectors.id)";

    using (var rdr = cmd.ExecuteReader())
    {
        using (DataTable dt = new DataTable())
        {
            dt.load(rdr)
        }
    }

这会引发错误:

ConstraintException: Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.

正在选择的字段(即各个表中的.name字段)被限制为Unique和Non-null。

2 个答案:

答案 0 :(得分:3)

如果您不需要约束(或用于调试以找到问题),您可以尝试在加载时关闭它们:

using (var rdr = cmd.ExecuteReader())
{
    using (DataSet ds = new DataSet())
    {
        using (DataTable dt = new DataTable())
        {
            ds.Tables.Add(dt);
            ds.EnforceConstraints = false;
            dt.Load(rdr);
            rdr.Close();
        }
     }
}

小心拼写错误:-)。这是免费的。

答案 1 :(得分:3)

尝试使用其他方法加载数据。 (免责声明:我没试过这个)

DataTable dataTable;
cmd.CommandText = @"SELECT 
    sectors.name AS sector_name,
    domains.name AS domain_name
    FROM sectors_domains
    INNER JOIN domains ON (sectors_domains.domain = domains.id)
    INNER JOIN sectors ON (sectors_domains.sector = sectors.id)";


// Create data adapter
SQLiteDataAdapter da = new SQLiteDataAdapter(cmd);

// Populate dataTable based on DB query
da.Fill(dataTable);
da.Dispose();