1

「PRAGMAforeign_keys = ON」を使用するか、次のように SQLite 接続文字列に属性を含めることを知っています。

con = "Data source = myData.sdb; foreign keys = true";

テスト用のデモも作成しましたが、問題なく動作しましたが、デモは非常に単純で、親テーブルには主キーが 1 つしかありませんでした。今度は、より複雑なケースに対処する必要がありますが、カスケードはまったく機能しません。これが私のテーブルです(親と子):

-- Parent table
create table ChuyenCongTac(
 MaNV varchar(12) references NhanVien(MaNV) on delete cascade on update cascade,
 NgayChuyenCT datetime,
 MaPhongTruoc int references PhongBan(MaPhong) on delete cascade on update cascade
 MaPhongSau int references PhongBan(MaPhong) on delete cascade on update cascade,
 NoiCongTacNgoai nvarchar(100),
 primary key (MaNV,NgayChuyenCT)
);

-- Child table
create table ChucVuChuyenCongTac(
 MaNV varchar(12) references ChuyenCongTac(MaNV) on delete cascade on update cascade,
 NgayChuyenCT datetime references ChuyenCongTac(NgayChuyenCT) on delete cascade on update cascade,
 CongTacTruoc bit,
 primary key(MaNV,NgayChuyenCT,MaChucVu,CongTacTruoc)
)

カスケード宣言に問題があると思いますが、何か問題がありますか? ここで注目すべき点は、親テーブルに 2 列の主キー (二重主キー) があることです。大丈夫かどうかわかりません。これは、SQLite ではなく、テーブル クエリを作成する際の私のせいだと思います。前回、SQLite でカスケードを成功させた後、私は非常に満足しました。現在のプロジェクトで SQLite を使用することに非常に興味を持ちました。

アップデート

テーブルを再設計しただけで、更新と削除のカスケードの問題がわかりました。ただし、VS 2010 の SQLite クエリ ウィンドウでのみ機能します (最初に PRAGMAforeign_keys=on を使用)。デモ プロジェクトでは正常に動作しましたが、C# コードが動作しません。本当にこれで立ち往生。

4

2 に答える 2

2

少し遅れましたが、同じ問題に出くわした人のために、自己メモとしてこれを追加します。

C# アプリケーションの接続文字列に "foreign keys = true" を追加しても、外部キー サポートは有効になりません。代わりに、次のようにします。

query.CommandText = "PRAGMA foreign_keys = ON;";
query.ExecuteNonQuery();

これにより、現在の接続の外部キー サポートが有効になります。

于 2015-01-09T14:10:09.330 に答える