web-dev-qa-db-fra.com

Activation des contraintes de clé étrangère dans SQLite

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?

34
patentfox

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.

  1. Assurez-vous que vous avez la la dernière version (1.0.73.0) de System.Data.SQLite installée (1.0.66.0 ne fonctionnera pas).
  2. Changez vos connexions à data source=C:\Dbs\myDb.db;foreign keys=true; (remplacez c:\dbs\mydb.db avec votre base de données SQLite).
54
Jer K

Allumez le pragma:

PRAGMA foreign_keys = ON;

Vous pouvez l'exécuter, comme tout autre relevé SQL.

6
Marcelo Cantos

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.

3
Chris Aelbrecht

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.

3
Nigel

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

2
tdammers

Ajouter à votre chaîne de connexion: ";EnforceFKConstraints=Yes|True|1;"

1
abatishchev

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 .

1
pinkfloydx33