c# - 在SQLite中启用外键约束




ado.net foreign-keys (8)

我正在使用SQLite和C#,并且有一些表定义了外键。

现在,我知道默认情况下,SQLite中没有强制执行外键约束,但我想将它们打开。

是否可以通过代码执行此操作? 我查了一个相关的question ,但我不知道如何通过C#代码来完成。 我正在使用Visual Studio 2008中可用的最新SQLite插件来设计我的表。

conn.Open();
SQLiteCommand cmd = new SQLiteCommand("PRAGMA foreign_keys = ON", conn);
cmd.ExecuteNonQuery(); 
conn.Close();

重新打开此连接时,我需要保持此更改。 可能吗?


Answers

我也在努力解决这个问题。 我决定在连接到数据库时调查在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='

瞧! 外键约束是强制执行的。


添加到您的连接字符串: ";EnforceFKConstraints=Yes|True|1;"


另一个解决方案是对每个查询执行“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的函数中,则可以重用它。


看起来你可以只执行SQL命令PRAGMA foreign_keys = ON; 您的数据库连接就像您选择或更新语句一样。 虽然你必须确保你的SQLite是用外键等编译的。 看到Here


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

这些应该提供您正在寻找的信息:

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(我希望是这种情况)对于任何二进制分发)。


打开pragma:

PRAGMA foreign_keys = ON;

您可以像执行任何其他SQL语句一样执行此操作。


我的方式:

new UriBuilder(url) { Query = string.Empty }.ToString()

要么

new UriBuilder(url) { Query = string.Empty }.Uri




c# sql sqlite ado.net foreign-keys