ON DELETE CASCADE无法在c#中工作

时间:2014-05-06 10:55:43

标签: c#-4.0 sqlite

当我从第一个表中删除C#中带有ExecuteNonQuery()的主键时,它不会影响第二个表。 但是当我对SQLiteStudio做同样的事情时,它会影响第二个表。

这是我的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 个答案:

答案 0 :(得分:2)

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

  

从SQLite版本3.6.19开始,外键强制的默认设置为OFF。但是,这可能会在SQLite的未来版本中发生变化。

至于现在,这仍然是默认的。

CL已告诉您foreign_keys设置为"每个连接" - 这意味着每次与SQLite数据库建立新连接时,foreign_keys pragma都会设置为默认值,即false

您需要做的是在每次与SQLite建立连接后执行PRAGMA foreign_keys = 1;,因此您的C#应用​​程序可以使用外键。

这实际上是SQLiteStudio内部所做的事情以及它在那里工作的原因。