我正在使用SQLite和C#,并且有一些表定义了外键。
现在,我知道默认情况下,SQLite中没有强制执行外键约束,但我想将它们打开。
是否可以通过代码执行此操作?我查找了一个相关的question,但我不知道如何通过C#代码来完成它。我正在使用Visual Studio 2008中最新的SQLite插件来设计我的表。
conn.Open();
SQLiteCommand cmd = new SQLiteCommand("PRAGMA foreign_keys = ON", conn);
cmd.ExecuteNonQuery();
conn.Close();
重新打开此连接时,我需要保持此更改。有可能吗?
答案 0 :(得分:54)
最后从this post得出结论。 PRAGMA foreign_key设置不会保留,但您可以在每次在 ConnectionString 中建立连接时进行设置。这允许您使用Visual Studio的表适配器。
data source=C:\Dbs\myDb.db;foreign keys=true;
(用您的sqlite数据库替换C:\ Dbs \ myDb.db)。答案 1 :(得分:6)
打开编译指示:
PRAGMA foreign_keys = ON;
您可以像执行任何其他SQL语句一样执行此操作。
答案 2 :(得分:3)
另一个解决方案是对每个查询执行“PRAGMA foreign_keys = ON”。
SQLiteConnection connection = new SQLiteConnection("Data Source=" + dbSQLite + ";Read Only=False;"); connection.Open(); SQLiteCommand mycommand = new SQLiteCommand(connection); mycommand.CommandText = "PRAGMA foreign_keys=ON"; mycommand.ExecuteNonQuery(); mycommand.CommandText = "DELETE FROM table WHERE ID=x"; mycommand.ExecuteReader(); connection.Close();
如果将它放在传递CommandText的函数中,则可以重复使用它。
答案 3 :(得分:3)
我也很难解决这个问题。我决定在连接到数据库时调查SQLDriverConnect()
中生成的完整连接字符串。这是它返回的内容:
'Driver={SQLite3 ODBC Driver};Database=C:\Users\Staples\Documents\SQLLiteTest.s3db;StepAPI=;SyncPragma=;NoTXN=;Timeout=;ShortNames=;LongNames=;NoCreat=;NoWCHAR=;FKSupport=;JournalMode=;OEMCP=;LoadExt=;BigInt=;PWD='
如您所见,有一个FKSupport
属性。
将FKSupport=True;
添加到我的连接字符串后,它返回了:
'Driver={SQLite3 ODBCDriver};Database=C:\Users\Staples\Documents\SQLLiteTest.s3db;StepAPI=;SyncPragma=;NoTXN=;Timeout=;ShortNames=;LongNames=;NoCreat=;NoWCHAR=;FKSupport=True;JournalMode=;OEMCP=;LoadExt=;BigInt=;PWD='
瞧!外键约束是强制执行的。
答案 4 :(得分:2)
这些应该提供您正在寻找的信息:
http://www.sqlite.org/faq.html#q22
http://www.sqlite.org/foreignkeys.html#fk_enable
简而言之,3.6.19之前的版本根本不强制执行外键,但可以使用触发器模拟它们;从3.6.19开始,可以强制执行外键,但是需要使用PRAGMA foreign_keys = ON
语句为每个连接启用,并且必须在启用触发器和外键支持的情况下编译sqlite(我希望它是任何二元分布的情况。)
答案 5 :(得分:1)
看起来您可以像在Select或Update语句上一样在数据库连接上执行SQL命令PRAGMA foreign_keys = ON;
。虽然您必须确保您的SQLite是使用外键等编译的。请参阅Here。
答案 6 :(得分:1)
添加到您的连接字符串:";EnforceFKConstraints=Yes|True|1;"
答案 7 :(得分:-1)
In C++ store app the following code helped me to enable PRAGMA foreign_keys
sqlite3_stmt* stmt;
sqlite3_prepare(db, "PRAGMA foreign_keys = ON;", -1, &stmt, 0);
sqlite3_step(stmt);
I called this after creating db using the call of
int rc = sqlite3_open16(path->Data(), &db);