2012-10-17 42 views
1

我想爲我們的軟件實施患者數據庫,並與外鍵聲明有問題。我正在使用最新的SQLite DLL和C#。C#與SQLite和外鍵

當我嘗試下面的代碼運行:

dbConnection = "Data Source=SQLiteMyDatabase.db;foreign keys=true;"; 
if (connections == 0) 
{ 
    cnn = new SQLiteConnection(dbConnection); 
    cnn.Open(); 
    this.ExecuteNonQuery("CREATE TABLE IF NOT EXISTS patients (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name VARCHAR(100) NOT NULL;"); 
    this.ExecuteNonQuery("CREATE TABLE IF NOT EXISTS images (FOREIGN KEY (patientID) REFERENCES patients(id), nameRed VARCHAR(20) NOT NULL PRIMARY KEY;"); 
} 

我得到的錯誤:

SQLite error near "FOREIGN": syntax error 

爲什麼會出現這種情況?

+0

你確定this.ExecuteNonQuery是不是錯誤的語句? – Habibillah

+0

你是什麼意思?第一個數據表工作正常,我的第二個查詢中的某些內容必須是錯誤的。我已經測試過第一個表格,並且它工作正常,第二個表格導致錯誤。所以是的,聲明是錯誤的,但我不知道在哪裏。 – SinisterMJ

+0

這應該是cnn.ExecuteNonQuery ... – Habibillah

回答

4

爲了創建一個外鍵,您必須首先創建列:

CREATE TABLE IF NOT EXISTS images (
    nameRed VARCHAR(20) NOT NULL PRIMARY KEY, 
    patientID INT, 
    FOREIGN KEY (patientID) REFERENCES patients(id) 
); 

請注意:

  1. 我感動的主鍵列(nameRed)第一列的列表創造,但這只是公約。它可以排在第二位。
  2. 您使用數據類型VARCHAR並且SQlite將接受該數據類型,但是請注意,它已被映射爲TEXT類型,最大長度將被忽略,並且您將能夠在該列中存儲其他數據類型。對於數據類型,SQLite有點有趣(它具有非常深思熟慮的系統,但與大多數其他SQL數據庫完全不同)。
  3. 爲了讓事情更加令人困惑,您允許將PRIMARY KEY聲明爲該列的屬性(儘管您也可以像FOREIGN KEY一樣在列列後執行該操作)。
+0

很好,謝謝,它現在可以工作。我對數據庫並不熟悉,也看不出有什麼不對。 – SinisterMJ

+0

第二條評論是什麼意思? 「你將能夠在列中存儲其他數據類型」? – SinisterMJ

+1

SQLite使用動態類型;它允許你在你的列中插入*任何*。請參見[數據類型在SQLite](http://www.sqlite.org/datatype3.html)。 –