ON DELETE CASCADE在C#中不起作用 [英] ON DELETE CASCADE not working in c#

查看:50
本文介绍了ON DELETE CASCADE在C#中不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我从第一个表中使用C#中的 ExecuteNonQuery()删除主键时,它不会影响第二个表.但是,当我对SQLiteStudio执行相同操作时,的确会影响第二张表.

When I delete a primary key with ExecuteNonQuery() in C# from the first table it doesn't affect the second table. But when I do the same with SQLiteStudio it does affect the second table.

这是我的SQLite代码:

Here is my SQLite code:

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();

我的查询:从LastnostiZdravila删除,其中NACIONALNA_SIFRA =" +'" + NacionalnaSifraBrisanje +'" +;";

(我检查NacionalnaSifraBrisanje的sql命令)

(I check NacionalnaSifraBrisanje for sql commands)

推荐答案

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

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

As of SQLite version 3.6.19, the default setting for foreign key enforcement is OFF. However, that might change in a future release of SQLite.

就目前而言,它仍然默认为false.

As for now, this still defaults to false.

CL已经告诉您 foreign_keys 设置是每个连接"-这意味着每次您与SQLite数据库建立新连接时, foreign_keys 编译指示设置为默认值,即 false .

CL already told you that foreign_keys setting is "per connection" - what it means is that every time you make a new connection to the SQLite database, the foreign_keys pragma is set to default value, which is false.

您需要做的是在您与SQLite进行每次连接后执行 PRAGMA foreign_keys = 1; ,因此C#应用程序会使用外键.

What you need to do is to execute PRAGMA foreign_keys = 1; after every connection you make to the SQLite, so foreign keys are honored by your C# application.

这实际上是SQLiteStudio在内部执行的操作,这就是为什么它可以在其中工作的原因.

This is actually what SQLiteStudio does internally and that's why it works there.

这篇关于ON DELETE CASCADE在C#中不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆