J'utilise SQLite avec C # et j'ai des tables avec des clés étrangères définies.
Maintenant, je sais que par défaut les contraintes de clé étrangère ne sont pas appliquées dans SQLite, mais j'aimerais les activer.
Est-il possible de le faire par le code? J'ai regardé une question liée question , mais je ne sais pas comment le faire via C # Code. J'utilise le dernier plug-in de SQLite disponible pour Visual Studio 2008 pour la conception de mes tables.
conn.Open();
SQLiteCommand cmd = new SQLiteCommand("PRAGMA foreign_keys = ON", conn);
cmd.ExecuteNonQuery();
conn.Close();
J'ai besoin de ce changement pour persister lorsque cette connexion est rouverte. Est-il possible?
Finalement compris cela de ce post . Le paramètre Pragma Foreign_Key ne persiste pas, mais vous pouvez la définir à chaque fois que la connexion est faite dans les connexions . Cela vous permet d'utiliser des adaptateurs de table Visual Studio.
data source=C:\Dbs\myDb.db;foreign keys=true;
(remplacez c:\dbs\mydb.db avec votre base de données SQLite).Allumez le pragma:
PRAGMA foreign_keys = ON;
Vous pouvez l'exécuter, comme tout autre relevé SQL.
Une autre solution consiste à faire le "Pragma Foretrge_Keys = On" avec chaque requête.
Connexion SQLITEConnection = nouvelle SQLITEConnection ("Source de données =" + dbsqlite + "; lecture seule = false;"); Connexion.Open (); SQLITECOMMAND MYCOMMAND = NOUVEAU SQLITECOMMAND (connexion); mycommand.commandtext = "pragma étrangère_keys = on"; mycommand.exécuténonquery (); mycommand.commandtext = "Supprimer de la table où id = x"; [.____] MyCommand.executerAreader (); Connexion.close ();
Si vous le mettez dans une fonction à laquelle vous passez le commandement, vous pouvez le réutiliser.
J'ai trop lu avec ce problème. J'ai décidé d'enquêter sur la chaîne de connexion complète générée dans SQLDriverConnect()
lors de la connexion à la base de données. C'est ce qu'il a revenu:
'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='
Comme vous pouvez le constater, il y a une propriété FKSupport
. Après avoir ajouté FKSupport=True;
à ma chaîne de connexion, il a renvoyé ceci:
'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='
Et voila! Les principales contraintes étrangères sont appliquées.
Ceux-ci devraient fournir les informations que vous recherchez:
http://www.sqlite.org/faq.html#q22
http://www.sqlite.org/forignkeys.html#fk_enable
En bref, les versions avant 3.6.19 n'appliquent pas du tout des clés étrangères, mais elles peuvent être simulées à l'aide de déclencheurs; En commençant par 3.6.19, les clés étrangères peuvent être appliquées, mais cela doit être activé par connexion en utilisant le PRAGMA foreign_keys = ON
Déclaration et SQLite doivent être compilées avec la gâchette et la prise en charge de la clé étrangère activée (que j'attendais être le cas pour toute distribution binaire).
Ajouter à votre chaîne de connexion: ";EnforceFKConstraints=Yes|True|1;"
On dirait que vous pouvez simplement exécuter la commande SQL PRAGMA foreign_keys = ON;
Sur votre connexion DB, comme si vous voulez une instruction SELECT ou une mise à jour. Bien que vous ayez à vous assurer que votre SQLite a été compilé avec des clés étrangères etc. Voir ICI .