web-dev-qa-db-fra.com

Chaîne de connexion SQL Express: emplacement du fichier mdf par rapport à l'emplacement de l'application

J'utilise des bases de données SQL Express dans le cadre d'un projet de test unitaire en c #. Mes bases de données se trouvent ici:

./Databases/MyUnitTestDB.mdf

Je voudrais utiliser un chemin ou une variable relative dans le app.config plutôt que d'avoir ma chaîne de connexion définie comme:

AttachDbFilename=C:\blah\blah\blah\yea\yea\yea\MyApplication\Databases\MyUnitTestDB.mdf 

J'ai vu l'utilisation de |DataDirectory| mais ai-je raison de penser que cela ne s'applique qu'aux applications Web?

Je veux contrôler cela dans le fichier de configuration de l'application, car en production, l'application utilise une base de données SQL hébergée.

44
Adam Jenkin

Merci à tous, j'ai utilisé une combinaison de vos réponses.

Dans mon fichier app.config, ma chaîne de connexion est définie comme suit

<add name="MyConnectionString"
    connectionString="Server=.\SQLExpress;AttachDbFilename=|DataDirectory|\MyDatabase.mdf;Database=MyDatabaseForTesting;Trusted_Connection=Yes;" />

Dans ma classe de test unitaire, j'ai défini la propriété DataDirectory à l'aide des éléments suivants

[TestInitialize]
public void TestInitialize()
{
    AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Databases"));

    // rest of initialize implementation ...
}
64
Adam Jenkin

Oui, | DataDirectory | Application Web pour sélectionner le répertoire App_Data de l'application Web.

Dans une application non Web, selon .NET Framework, il pourrait être utilisé et également modifié à l'aide de AppDomain.SetData

Mais vous avez deux autres possibilités pour créer la connexion:

1.- Utilisez un chemin relatif:

String con ="... AttachDbFilename=Databases\MyUnitTestDB.mdf ... ";

2.- obtenir le chemin de l'application et l'ajouter à la chaîne .
Dans l'application Windows c #, vous pouvez utiliser Application.StartupPath

 String con= " ... AttachDbFilename=" + Application.StartupPath + "\Databases\MyUnitTestDB.mdf ... ";

Selon le type d'application ou le mode de lancement, vous obtenez différentes propriétés. Ex:

  • Application.StartupPath - Le chemin de démarrage de l'application exe qui démarre l'application
  • Application.ExecutablePath - le chemin de démarrage un nom de l'application exe qui statistique l'application Mais pour utiliser Application, vous devez inclure System.Windows.Forms qui n'est pas inclus par exemple dans les applications console.

  • System.IO.Path.GetDirectoryName (System.Reflection.Assembly.GetExecutingAssembly (). GetName (). CodeBase ) - Ceci obtient le chemin depuis le l'assembly actuel "dll, exe, ..." n'est pas affecté par le type d'application, les modifications de chemin, ... toujours retourner le répertoire lorsque l'assemby réside.

  • Environment.CurrentDirectory - le répertoire courant. Cela peut être modifié par exemple si vous naviguez dans des dossiers.

Vous pouvez trouver plus d'informations sur les différentes options de chaîne de connexion ici http://www.connectionstrings.com/sql-server-2005

12
Dubas

J'ai passé une journée entière à googler pour résoudre ce problème et j'ai enfin un indice de this

Voici ma solution:
1. Utilisez | DataDirectory | dans la chaîne de connexion

<add name="NorthwindConnectionString" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDbFilename=|DataDirectory|\Northwind.mdf;User Instance=True" providerName="System.Data.SqlClient" />

2.Définissez DataDirectory dans ClassInitialize

[ClassInitialize()]
public static void MyClassInitialize(TestContext testContext)
{
    string baseDir = AppDomain.CurrentDomain.BaseDirectory;
    int index = baseDir.IndexOf("TestResults");
    string dataDir = baseDir.Substring(0, index) + System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
    AppDomain.CurrentDomain.SetData("DataDirectory", dataDir);
}

enter image description here

8
nonetaku

Je crée une simple application Windows Forms avec VS2010 avec C # 3.0. Utilisant également SQL Express 2008 RC2.

Je peux utiliser: |DataDirectory|MyDb.mdf dans la chaîne de connexion seule sans rien changer d'autre. Le |DataDirectory| pointe vers l'emplacement de mon fichier .exe.

Je pense que ce serait la première chose que vous essayez tous, c'est pourquoi je spécifie ma version VS et SQL. Ou peut-être que c'est nouveau pour C # 3.0.

Ma chaîne de connexion complète:

"Server=.\SQLExpress;AttachDbFilename=|DataDirectory|App_Data\ThumbsUpPlayer.mdf;Database=ThumbsUpPlayer;Trusted_Connection=Yes;"

Notez que j'ai ajouté un dossier "App_Data" à mon application, car je suis habitué à la base de données dans ce dossier, le dossier n'est pas reconnu par VS.

4
Wasted_Coder

Je n'ai pas Visual Studio ici, mais qu'en est-il:

using System.IO;
using System.Windows.Forms;

string appPath = Path.GetDirectoryName(Application.ExecutablePath);
AttachDBFilme = appPath + "\\MyUnitTestDB.mdf"
2
João Pereira

J'ai fait ce qui suit. J'espère que cela aide quelqu'un.

AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Path.GetFullPath(AppDomain.CurrentDomain.BaseDirectory + "../../App_Data"));
1
cgatian

Chemin dynamique dans la connexion SQL Server

SqlConnection  con="Server=.\SQLExpress;AttachDbFilename=|DataDirectory|\MyDatabase.mdf;Database=MyDatabaseForTesting;Trusted_Connection=Yes;" ;
0
Mohit Kotak