40

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 trouve ici:Chaîne de connexion SQL Express: emplacement du fichier mdf relatif à l'emplacement de l'application

./Databases/MyUnitTestDB.mdf 

Je voudrais utiliser un chemin ou variable par rapport au 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 

Je l'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.

Répondre

58

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

Dans mon app.config déposer 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 je mis la propriété DataDirectory en utilisant ce qui suit

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

    // rest of initialize implementation ... 
} 
+0

Pour en savoir plus sur le terme ** DataDirectory **: http://msdn.microsoft.com/en-us/library/cc716756.aspx (recherchez "" DataDirectory ", c'est à la fin du document) –

2

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

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

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

Je suggère quelque chose le long de cette ligne, peut-être utilisé conjointement avec [les constructeurs de chaîne de connexion] de ADO.NET (http://msdn.microsoft.com/en-us/library/ms254947.aspx) de mettre sur pied la chaîne de connexion finale. – stakx

12

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

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

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

1 .- Utiliser un chemin relatif:

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

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

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

En fonction du type de applicaiton ou le mode de lancement, vous avez obtenu des propriétés différentes. Ex:

  • Application.StartupPath - Le chemin de démarrage de l'application exe qui commence l'application
  • Application.ExecutablePath - le chemin de départ un nom de l'application exe que l'application stats 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) - Ce obtient le chemin de l'ensemble courant « dll, exe, ... "N'est pas affecté par le type d'application, les changements de chemin, ... Toujours retourner le répertoire lorsque l'Assemby réside.

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

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

+0

Merci Dubas, l'option 1 est ce que je veux utiliser mais je ne peux pas obtenir ce travail. –

+0

L'option 1 dépend de votre chemin d'exécution. Si votre test UInit s'exécute avec un chemin différent que votre application probablement l'utilisation d'un chemin relatif vous donne un chemin différent du chemin attendu. – Dubas

+0

+1 Grande réponse – sohaiby

6

J'ai passé toute une journée googler pour travailler cela à travers et enfin avoir une idée de this

Voici ma solution:
1. Utiliser | 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.Réglez 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

3

Je construis un Windows Forms simple App avec VS2010 avec C# 3.0. En 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| indique l'emplacement de mon fichier .exe.

Je pense que ce serait la première chose que vous essayeriez 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 complète de connexion:

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

Notez que j'ai ajouté un dossier « App_Data » à ma demande, parce que je suis habitué à la Db dans ce dossier, le dossier est pas reconnu par VS.

+2

Voulez-vous dire" App_Data "au lieu de" App_Code "dans la dernière phrase? – Manfred

+0

@Manfred oui vous avez raison! Réponse éditée –

0

chemin dynamique dans la connexion SQL Server

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

je l'ai fait ce qui suit. J'espère que ça aide quelqu'un.

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