ConstraintException при запросе базы данных SQlite с помощью C # - PullRequest
4 голосов
/ 16 февраля 2011

Я надеюсь, что кто-нибудь сможет помочь с моей проблемой базы данных SQLite.

Я получаю ConstraintException при запросе моей базы данных SQLite с помощью C #.Полное сообщение об исключении: «Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.». Первоначально я создал эту базу данных, используя доступ, который работал нормально, но по разным причинам мне пришлось воссоздать ее с использованием SQLite.программа планирования состояния.Каждый Status имеет ассоциированные Account и Schedule.Я понимаю, что Statuses и Schedule являются отношениями 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);

У меня не было проблем, пока я не создал два Statues и связал их с одним и тем же Account.

Accounts
ID  Name
1   Fred Blogs

Statuses
ID AccountId Text
1         1          “Some text”
2         1          “Some more text”

Schedule
ID    StartDate     Frequency
1     16/02/2011        1
2     16/02/2011        1

Используемый мной оператор выбора, который выбрасывает исключение:

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;

    }

Любая помощь будет оценена.Спасибо.

Ответы [ 3 ]

2 голосов
/ 18 февраля 2011

Я нашел способ обойти эту проблему.Если я выберу 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
2 голосов
/ 16 февраля 2011

ошибка происходит из-за столбцов идентификаторов в таблице «Состояния» и в таблице «Расписание».Если они не важны, удалите столбцы из двух таблиц.

0 голосов
/ 20 сентября 2013

Я исправил проблему, сначала прочитав схему, затем снял ограничения с данных и затем снова прочитал данные.как это:

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 различных таблиц, объединенных.Похоже, что это ограничения первой объединенной таблицы (имя было уникальным для этой таблицы, но повторялось в представлении несколько раз)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...