Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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# 使用C查询SQlite数据库时的ConstraintException_C#_Database_Database Design_Sqlite - Fatal编程技术网

C# 使用C查询SQlite数据库时的ConstraintException

C# 使用C查询SQlite数据库时的ConstraintException,c#,database,database-design,sqlite,C#,Database,Database Design,Sqlite,我希望有人能帮助解决我的SQLite数据库问题 使用C查询我的SQLite数据库时,我收到一个ConstraintException。完整的异常消息是“未能启用约束。一行或多行包含违反非null、唯一或外键约束的值”。我最初使用access构建此数据库,运行良好,但是由于各种原因,我不得不使用SQLite重新创建它 这是一个简单的状态调度程序。每个状态都有一个关联的帐户和计划。我意识到状态和时间表是1:1的关系,可以在同一个表中,但为了让程序进一步发展,我将它们分为两个表 请参阅下面的“我的表格

我希望有人能帮助解决我的SQLite数据库问题

使用C查询我的SQLite数据库时,我收到一个ConstraintException。完整的异常消息是“未能启用约束。一行或多行包含违反非null、唯一或外键约束的值”。我最初使用access构建此数据库,运行良好,但是由于各种原因,我不得不使用SQLite重新创建它

这是一个简单的状态调度程序。每个状态都有一个关联的帐户和计划。我意识到状态和时间表是1:1的关系,可以在同一个表中,但为了让程序进一步发展,我将它们分为两个表

请参阅下面的“我的表格脚本”的精简版本,这足以重新创建问题

PRAGMA foreign_keys = ON;

CREATE TABLE Accounts
(ID INTEGER PRIMARY KEY AUTOINCREMENT,
Name char(100));

CREATE TABLE Statuses
(ID INTEGER PRIMARY KEY AUTOINCREMENT,
AccountId INTEGER REFERENCES Accounts(ID) ON DELETE CASCADE,
Text char(140));

CREATE TABLE Schedule
(ID INTEGER PRIMARY KEY REFERENCES Statuses(ID) ON DELETE CASCADE,
StartDate char(255),
Frequency INT);
我没有任何问题,直到我创建了两个雕像并将它们关联到同一个帐户

我使用的引发异常的select语句是:

SELECT Statuses.Id, Statuses.Text, Accounts.Id, Accounts.Name, Schedule.StartDate, Schedule.Frequency
FROM [Statuses], [Accounts], [Schedule]
WHERE Statuses.AccountId = Accounts.Id AND Statuses.Id = Schedule.Id
如果我运行相同的查询,但删除“Accounts.Id”列,则查询工作正常

下面是我正在使用的C代码,但我认为这不是问题所在

public DataTable Query(string commandText)
    {

        SQLiteConnection sqliteCon = new SQLiteConnection(ConnectionString);
        SQLiteCommand sqliteCom = new SQLiteCommand(commandText, sqliteCon);
        DataTable sqliteResult = new DataTable("Query Result");

        try
        {
            sqliteCon.Open();
            sqliteResult.Load(sqliteCom.ExecuteReader());
        }
        catch (Exception)
        {
            throw;
        }
        finally
        {
            sqliteCon.Close();
        }

        return sqliteResult;

    }

任何帮助都将不胜感激。谢谢。

由于状态表和日程表中的ID列,出现了错误。如果它们不重要,请从两个表中删除列。

我找到了解决此问题的方法。如果我从Schedule表而不是Accounts表中选择AccountId,则不会引发异常。似乎我无法运行包含两个唯一主键列的SELECT语句

所以不是

SELECT Statuses.Id, Statuses.Text, Accounts.Id, Accounts.Name, Schedule.StartDate, Schedule.Frequency
FROM [Statuses], [Accounts], [Schedule]
WHERE Statuses.AccountId = Accounts.Id AND Statuses.Id = Schedule.Id
我跑

SELECT Statuses.Id, Statuses.Text, Statuses.AccountId, Accounts.Name, Schedule.StartDate, Schedule.Frequency
FROM [Statuses], [Accounts], [Schedule]
WHERE Statuses.AccountId = Accounts.Id AND Statuses.Id = Schedule.Id

我修复了这个问题,首先只读取模式,然后清除datatable的约束,然后再次读取数据。 像这样:

DataSet DS = new DataSet();
mytable = new DataTable();
DS.Tables.Add(mytable);
DS.EnforceConstraints = false;
SQLiteCommand command = DBconnection.CreateCommand();
command.CommandText = "select * from V_FullView";
SQLiteDataReader reader = command.ExecuteReader(CommandBehavior.SchemaOnly);
mytable.Load(reader);
mytable.Constraints.Clear();
reader = command.ExecuteReader();
mytable.Load(reader);
reader.Close();

我的V_FullView是4个不同表合并的视图。似乎约束是第一个合并表的约束,该表的名称在该表上是唯一的,但在视图中复制了多次

感谢您的响应。Id列很重要,因为我需要将计划链接到状态。每个状态都有相应的计划。例如,Id为1的状态链接到Id为1的计划。计划Id是外键。此外,我不确定问题是否与时间表有关,因为问题仅在我选择[Account.Id]和[Status.Id]时出现
DataSet DS = new DataSet();
mytable = new DataTable();
DS.Tables.Add(mytable);
DS.EnforceConstraints = false;
SQLiteCommand command = DBconnection.CreateCommand();
command.CommandText = "select * from V_FullView";
SQLiteDataReader reader = command.ExecuteReader(CommandBehavior.SchemaOnly);
mytable.Load(reader);
mytable.Constraints.Clear();
reader = command.ExecuteReader();
mytable.Load(reader);
reader.Close();