2014-05-06 156 views
0

當我從第一個表中刪除C#中的ExecuteNonQuery()的主鍵時,它不會影響第二個表。 但是,當我對SQLiteStudio執行相同操作時,它會影響第二個表。ON DELETE CASCADE在c中不工作#

這裏是我的SQLite代碼:

CREATE TABLE Zdravila(
    ID INTEGER PRIMARY KEY, 
    NACIONALNA_SIFRA INTEGER UNIQUE NOT NULL, 
    IME_ZDRAVILA TEXT, 
    POIMENOVANJE_IZDELKA TEXT NOT NULL, 
    SIFRA_REZIM_IZDAJE INTEGER NOT NULL, 
    ATC_OZNAKA TEXT NOT NULL, 
    NAZIV_POTI_UPORABE TEXT NOT NULL, 
    FOREIGN KEY(NACIONALNA_SIFRA) REFERENCES LastnostiZdravila(NACIONALNA_SIFRA) ON DELETE CASCADE ON UPDATE CASCADE 
    ); 

CREATE TABLE LastnostiZdravila(
    NACIONALNA_SIFRA INTEGER PRIMARY KEY, 
    NAZIV_FARMACEVTSKE_OBLIKE TEXT NOT NULL, 
    KOLICINA_OSNOVNE_ENOTE INTEGER NOT NULL CHECK (KOLICINA_OSNOVNE_ENOTE > 0), 
    OZNAKA_OSNOVNE_ENOTE TEXT NOT NULL, 
    PAKIRANJE TEXT NOT NULL, 
    SIFRA_IMETNIKA_DOVOLJENJA TEXT NOT NULL 
    ); 

PRAGMA foreign_keys = ON; 

而且我的C#代碼:

SQLiteConnection conn = new SQLiteConnection(poveziZBazo); 
       SQLiteCommand sqlQuery = new SQLiteCommand(sql); 
       sqlQuery.Connection = conn; 
       conn.Open(); 
       SQLiteTransaction trans; 
       trans = conn.BeginTransaction(); 

       sqlQuery.CommandText = sql; 
       j = sqlQuery.ExecuteNonQuery(); 
       trans.Commit(); 
       sqlQuery.Dispose(); 
       conn.Close(); 

我的查詢: "DELETE FROM LastnostiZdravila WHERE NACIONALNA_SIFRA = " + "'" + NacionalnaSifraBrisanje + "'" + ";";

(我檢查NacionalnaSifraBrisanje的SQL命令)

+1

'foreign_keys'設置是每個連接。 –

+0

你是什麼意思? – Theory

+0

將其設置爲一個連接不會影響其他任何連接。 –

回答

2

根據http://sqlite.org/pragma.html#pragma_foreign_keys

從SQLite版本3.6.19開始,外鍵強制的默認設置爲OFF。但是,這可能會在未來的SQLite版本中發生變化。

至於現在,這仍然默認爲false。

CL已經告訴你,foreign_keys設置爲「每個連接」 - 它的意思是,每次您對SQLite數據庫的新連接,該foreign_keys編譯被設置爲默認值,這是false

您需要做的是在每次與SQLite建立連接後執行PRAGMA foreign_keys = 1;,這樣外鍵就會被C#應用程序所尊敬。

這實際上是SQLiteStudio在內部做的,這就是它在那裏工作的原因。