3 votes

La base de données locale de C# n'est pas mise à jour lorsque l'on utilise |DataDirectory|.

J'utilise une base de données locale et pour une raison quelconque, lorsque j'utilise la fonction |DataDirectory| la base de données ne se met pas à jour quand j'ajoute/supprime

SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\HomeDB.mdf;Integrated Security=True");  
SqlDataAdapter da = new SqlDataAdapter();

DataTable dt = new DataTable();
DataSet ds = new DataSet();

MAIS Si j'utilise le répertoire suivant, cela fonctionne

SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=F:\Project\Home_Database\HomeDB.mdf;Integrated Security=True");  
SqlDataAdapter da = new SqlDataAdapter();

DataTable dt = new DataTable();
DataSet ds = new DataSet();

Quelqu'un sait-il pourquoi ?

3voto

Chetan Ranpariya Points 4289

|DataDirectory| a une valeur définie par le .NET Framework en fonction du système d'exploitation.

J'ai fait une expérience rapide à ce sujet comme suit.

class Program
{
    static void Main(string[] args)
    {
        var dataDirectory = AppDomain.CurrentDomain.GetData("DataDirectory");

        Console.WriteLine(dataDirectory);

        Console.ReadKey();
    }
}

Lorsque j'ai exécuté le code ci-dessus, il n'a rien affiché. En déboguant, j'ai compris que le dataDirectory la variable a une valeur null .

J'ai ensuite essayé de l'utiliser pour créer une connexion à la base de données et l'ouvrir.

 SqlConnection conn = new SqlConnection(@"Data Source=.;AttachDbFilename=|DataDirectory|\HomeDB.mdf;Integrated Security=True");

 conn.Open();

Ce code a échoué à conn.Open(); avec l'erreur suivante.

Une tentative d'attacher une base de données auto-nommée pour le fichier D:\Chetan\Sandbox\consoleapp1\ConsoleApp1\bin\Debug\HomeDB.mdf échoué. Une base de données avec le même nom existe, ou le fichier spécifié ne peut pas être ouvert, ou il est situé sur un partage UNC.

Comme vous pouvez le voir dans l'erreur, parce que ' |DataDirectory| est nul, l'application tente de localiser le .mdf à l'adresse bin\Debug sous le répertoire du projet, qui est en fait l'emplacement à partir duquel l'exe est exécuté.

Donc si vous voulez le |DataDirectory| ont une valeur différente, vous devez d'abord la modifier avant de l'utiliser. Comme suit.

class Program
{
    static void Main(string[] args)
    {
        var dataDirectory = AppDomain.CurrentDomain.GetData("DataDirectory");

        //Changing DataDirectory value.
        AppDomain.CurrentDomain.SetData("DataDirectory", "C:\\DataFiles");

        Console.WriteLine(dataDirectory);

        SqlConnection conn = new SqlConnection(@"Data Source=.;AttachDbFilename=|DataDirectory|\HomeDB.mdf;Integrated Security=True");

        conn.Open();

        Console.ReadKey();
    }
}

Avec ce code, j'ai remarqué que la valeur "C:\\DataFiles" a été utilisé pour localiser HomeDB.mdf .

Si vous lisez Ce site il explique l'ordre dans lequel les valeurs de |DataDirectory| sont élargis.

Ce site explique comment personnaliser la valeur de |DataDirectory| .

Venons-en maintenant à votre problème de données non reflétées.

Dans votre cas, |DataDirectory| a une valeur nulle, il se connecte donc à l'adresse suivante HomeDB.mdf situé à l'adresse bin\Debug o bin\Release en y apportant des modifications pendant que vous regardez F:\Project\Home_Database\HomeDB.mdf pour vérifier les changements.

Vous ne voyez pas l'erreur que je vois parce que le fichier .mdf est copié à l'emplacement de l'exécutable lorsque vous construisez le projet.

La solution à votre problème est donc de modifier la valeur de l'élément suivant |DataDirectory| en utilisant AppDomain.CurrentDomain.SetData("DataDirectory",<<yourvalue>>); método.

EDIT :

Si l'emplacement de .mdf est fixé relativement au fichier exécutable du projet, vous pouvez construire la valeur pour |DataDirectory| au moment de l'exécution et l'assigner.

Disons que vous avez un dossier Database au même endroit que le exe y Database Le dossier a HomeDB.mdf fichier. Vous devez donc d'abord trouver le chemin d'accès à partir duquel le fichier exe est en cours d'exécution et ajoute Database et l'affecter à |DataDirectory| .

//Get the current path from where the exe is running.
var currentDirectory = AppDomain.CurrentDomain.BaseDirectory;

//Build path to Database folder
var databasePath = currentDirectory + "Database";

//Assign it to DataDirectory
AppDomain.CurrentDomain.SetData("DataDirectory", databasePath);

var dataDirectory = AppDomain.CurrentDomain.GetData("DataDirectory");

Console.WriteLine(dataDirectory);

//Use DataDirectory to SQL Connection.
SqlConnection conn = new SqlConnection(@"Data Source=.;AttachDbFilename=|DataDirectory|\HomeDB.mdf;Integrated Security=True");

conn.Open();

Cela fonctionnerait sans aucun problème, quel que soit l'endroit où vous exécutez l'application. Cela fonctionnera tant que vous aurez Database et HomeDB.mdf dans ce dossier.

EDIT END

Vous pouvez également envisager de placer la chaîne de connexion dans le fichier de configuration, au lieu de la coder en dur dans le code lui-même.

J'espère que j'ai pu expliquer le point clairement et que cela vous aidera à résoudre votre problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X