2011-02-16 48 views
4

我希望有人能夠幫助我處理SQLite數據庫問題。用C#查詢SQlite數據庫時出現ConstraintException

我在用C#查詢SQLite數據庫時收到ConstraintException。完整的異常消息是「Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.」我最初使用訪問工作建立了這個數據庫,這很好,但由於各種原因,我不得不使用SQLite重新創建它。

給一點背景 - 這是一個簡單的狀態調度程序。每個Status都有一個關聯的AccountSchedule。我意識到StatusesSchedule是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語句是:

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; 

    } 

任何幫助將不勝感激。謝謝。

回答

2

我找到了解決這個問題的方法。如果我從Schedule表中選擇AccountId而不是Accounts表,則不會引發異常。看來我無法運行包含兩個唯一主鍵列的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

由於狀態表和計劃表中的ID列,發生錯誤。如果它們不重要,則從兩個表中刪除列。

+1

感謝您的回覆。 Id列很重要,因爲我需要將計劃鏈接到狀態。每個狀態都有相應的時間表。例如,Id 1的狀態鏈接到Id 1的Schedule。Schedule Id是一個外鍵。此外,我不確定問題是否與Schedule表相關,因爲只有在選擇[Account.Id]和[Status.Id]時纔會出現問題 – 2011-02-16 12:25:19

0

我只在第一次閱讀的模式固定的問題,然後清除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代不同的表的視圖合併。似乎約束條件是第一個合併表格的名稱(名稱在該名稱上是唯一的,但在視圖中複製了多次)

相關問題