Pourquoi enregistrer les modifications apportées à une base de données échoue?
J'ai suivantes de code C# dans une application console.
Chaque fois que je le débogage de l'application et de lancer la requête1 (qui insère une nouvelle valeur dans la base de données), puis exécutez query2 (qui affiche toutes les entrées dans la base de données), je peux voir la nouvelle entrée, j'ai inséré clairement. Cependant, lorsque je ferme l'application et de vérification de la table dans la base de données dans Visual Studio), il est parti. Je n'ai aucune idée de pourquoi c'est pas l'économie.
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlServerCe;
using System.Data;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
try
{
string fileName = "FlowerShop.sdf";
string fileLocation = "|DataDirectory|\\";
DatabaseAccess dbAccess = new DatabaseAccess();
dbAccess.Connect(fileName, fileLocation);
Console.WriteLine("Connected to the following database:\n"+fileLocation + fileName+"\n");
string query = "Insert into Products(Name, UnitPrice, UnitsInStock) values('NewItem', 500, 90)";
string res = dbAccess.ExecuteQuery(query);
Console.WriteLine(res);
string query2 = "Select * from Products";
string res2 = dbAccess.QueryData(query2);
Console.WriteLine(res2);
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
Console.ReadLine();
}
}
}
class DatabaseAccess
{
private SqlCeConnection _connection;
public void Connect(string fileName, string fileLocation)
{
Connect(@"Data Source=" + fileLocation + fileName);
}
public void Connect(string connectionString)
{
_connection = new SqlCeConnection(connectionString);
}
public string QueryData(string query)
{
_connection.Open();
using (SqlCeDataAdapter da = new SqlCeDataAdapter(query, _connection))
using (DataSet ds = new DataSet("Data Set"))
{
da.Fill(ds);
_connection.Close();
return ds.Tables[0].ToReadableString(); //a extension method I created
}
}
public string ExecuteQuery(string query)
{
_connection.Open();
using (SqlCeCommand c = new SqlCeCommand(query, _connection))
{
int r = c.ExecuteNonQuery();
_connection.Close();
return r.ToString();
}
}
}
EDIT: j'ai Oublié de mentionner que je suis à l'aide de SQL Server Compact Edition 4 et VS2012 Express.
Faites-vous de l'appareil de débogage ou de l'émulateur?
bouton de débogage dans visual studio (celui qui ressemble à un bouton de lecture) @kostasch.
Désolé, je pensais que vous déboguez une application mobile. Je pense que je me souviens d'un bouton de débogage ressemble :).
Votre insert est sur votre base de données et sélectionnez est sur les Produits. Est ir par copier coller erreur?
Copier coller erreur . fixe. merci pour la mention.
bouton de débogage dans visual studio (celui qui ressemble à un bouton de lecture) @kostasch.
Désolé, je pensais que vous déboguez une application mobile. Je pense que je me souviens d'un bouton de débogage ressemble :).
Votre insert est sur votre base de données et sélectionnez est sur les Produits. Est ir par copier coller erreur?
Copier coller erreur . fixe. merci pour la mention.
OriginalL'auteur Joe Slater | 2013-06-17
Vous devez vous connecter pour publier un commentaire.
C'est un problème assez fréquent. Vous utilisez le |DataDirectory| chaîne de substitution. Cela signifie que, pendant le débogage de votre application dans l'environnement de Visual Studio, la base de données utilisée par votre application se trouve dans le sous-dossier
BIN\DEBUG
dossier (ou x86 variante) de votre projet. Et cela fonctionne bien tant que vous n'avez pas n'importe quel type d'erreur de connexion à la base de données et de faire des opérations de mise à jour.Mais ensuite, vous quittez la session de débogage et vous regardez votre base de données via l'Explorateur de serveurs Visual Studio. Cette fenêtre a une autre chaîne de connexion (probablement pointant vers la copie de votre base de données dans le dossier du projet). Vous recherchez vos tables et vous ne voyez pas les changements.
Puis le problème s'aggraver. Vous redémarrez VS d'aller à la chasse pour le bug dans votre application, mais vous avez votre fichier de base de données répertoriés entre vos fichiers de projet et de la propriété
Copy to Output directory
est fixé àCopy Always
. À ce stade, Visual Studio oblige, une copie de l'original de la base de données de fichier à partir du dossier du projet dans le dossier de sortie (BIN\DEBUG) et donc vos changements sont perdus.Maintenant, votre demande insertions/les mises à jour de la table cible, encore vous ne pouvez pas trouver une erreur dans votre code et tout recommencer à nouveau jusqu'à ce que vous décidez d'afficher ou de recherche sur StackOverflow.
Vous pouviez arrêter ce problème de la modification de la propriété
Copy To Output Directory
àCopy If Newer
ouNever Copy
. Vous pouvez également mettre à jour votre connectionstring dans l'Explorateur de serveurs de regarder la copie de travail de votre base de données ou de créer une seconde connexion. Le premier des points encore à la base de données dans le dossier du projet tandis que le second l'un des points de la base de données dans le dossier BIN\DEBUG. De cette façon, vous pouvez garder l'original de la base de données prêt pour le déploiement des fins et des modifications de schéma, alors que, avec la deuxième connexion vous pouvez consulter les résultats de vos efforts de codage.MODIFIER Spéciaux d'avertissement pour MS-Access utilisateurs de base de données. Le simple fait de regarder votre tableau modifie la date de modification de votre base de données si vous n'avez pas d'écrire ou de changer quoi que ce soit. De sorte que le drapeau
Copy if Newer
de coups de pied dans le fichier de base de données est copié dans le répertoire de sortie. Avec Accès à une meilleure utilisationCopy Never
.OriginalL'auteur Steve
Commettre des modifications de l'enregistrement des modifications à travers les sessions de débogage est un sujet courant dans SQL CE forums. C'est quelque chose que les voyages en place un certain nombre de personnes. Je vais poster des liens vers la source des articles ci-dessous, mais je voulais coller la réponse qui semble pour obtenir les meilleurs résultats pour la plupart des gens:
Vous disposez de plusieurs options pour modifier ce comportement. Si votre fichier sdf est une partie du contenu de votre projet, cela va affecter la façon dont les données sont conservées. Rappelez-vous que lorsque vous déboguez, toutes les sorties de votre projet (y compris les sdf) si dans bin/debug dossier.
Vous pouvez décider de ne pas inclure le fichier sdf dans le cadre de votre projet et de gérer l'emplacement du fichier d'exécution.
Si vous êtes à l'aide de "copier si plus récent", et le projet de modifications apportées à la base de données écrasera toute exécution/débogage changements.
Si vous êtes à l'aide de "Ne pas copier", vous devez spécifier l'emplacement dans le code (comme les deux niveaux au-dessus de l'endroit où votre programme est en cours d'exécution).
Si vous avez des "Copy", toutes les modifications apportées au cours de l'exécution sera écrasé
Réponse Source
Voici un lien de discussion et comment la documentation.
OriginalL'auteur Ray K