2010-04-21 7 views
7

J'ai fait quelques recherches et aussi lu la FAQ sur le site SQLite, pas de chance de trouver une réponse à ma question.SQLite prend-il en charge les transactions sur plusieurs bases de données?

Il se peut très bien que mon approche de base de données soit défectueuse, mais pour l'instant, je voudrais stocker mes données dans plusieurs bases de données SQLite3, ce qui signifie des fichiers séparés. Je suis très préoccupé par la corruption de données due à l'écrasement de mon application, ou à une panne de courant au milieu de la modification des données dans mes tables.

Afin d'assurer l'intégrité des données, je dois essentiellement à faire:

begin transaction modifier la table (s) dans la base de données # 1 modifier la table (s) dans la base de données # 2 validée ou annulée si erreur

Est-ce que cela est pris en charge par SQLite? En outre, j'utilise sqlite.net, en particulier le dernier qui est basé sur SQLite 3.6.23.1.

MISE À JOUR

Une question - est-ce quelque chose des gens en général ajouter à leurs tests unitaires? J'ai toujours testé des bases de données, mais je n'ai jamais eu de cas comme celui-ci. Et si oui, comment le feriez-vous? C'est presque comme si vous deviez passer un autre paramètre à la méthode comme bool test_transaction, et si c'est vrai, lancer une exception entre les accès à la base de données. Ensuite, testez après l'appel pour vous assurer que le premier ensemble de données ne l'a pas fait dans l'autre base de données. Mais peut-être est-ce quelque chose qui est couvert par les tests SQLite, et devrait pas apparaître dans mes cas de test.

+0

Je ne pense pas que vous voulez ajouter à des tests unitaires. C'est comme si les transactions fonctionnent bien, il est inutile de les tester encore et encore. Faites juste quelques tests initiaux pour vous assurer que les insertions, les mises à jour, les rollbacks etc sont corrects et que vous êtes prêt à partir. –

+0

ok, je pensais que ce serait mieux. parfait! – Dave

Répondre

11

Oui transactions fonctionne avec une base de données sqlite différente et même entre sqlite et sqlserver. Je l'ai essayé plusieurs fois.

Quelques liens et informations

A partir de là - Transaction between different data sources.

Depuis Fournisseur SQLite ADO.NET 2.0 prend en charge enlistement de transaction, non seulement il est possible d'effectuer une transaction sur plusieurs sources de données SQLite, mais aussi enjambant autre base de données des moteurs tels que SQL Server.

Exemple:

using (DbConnection cn1 = new SQLiteConnection(" ... ")) 
using (DbConnection cn2 = new SQLiteConnection(" ... ")) 
using (DbConnection cn3 = new System.Data.SqlClient.SqlConnection(" ... ")) 
using (TransactionScope ts = new TransactionScope()) 
{ 
    cn1.Open(); cn2.Open(); cn3.Open(); 
    DoWork1(cn1); 
    DoWork2(cn2); 
    DoWork3(cn3); 
    ts.Complete(); 
} 

Comment joindre une nouvelle base de données:

SQLiteConnection cnn = new SQLiteConnection("Data Source=C:\\myfirstdatabase.db"); 
cnn.Open(); 

using (DbCommand cmd = cnn.CreateCommand()) 
{ 
    cmd.CommandText = "ATTACH DATABASE 'c:\\myseconddatabase.db' AS [second]"; 
    cmd.ExecuteNonQuery(); 

cmd.CommandText = "SELECT COUNT(*) FROM main.myfirsttable INNER JOIN second.mysecondtable ON main.myfirsttable.id = second.mysecondtable.myfirstid"; 


    object o = cmd.ExecuteScalar(); 

} 
+0

Je retire mon chapeau. +1! –

+0

Je dois encore écrire le code pour exécuter des transactions sur plusieurs bases de données, mais je suis presque prêt à le vérifier! :) – Dave

Questions connexes