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.
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 ...
}
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.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
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);
}
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.
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"
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"));
SqlConnection con="Server=.\SQLExpress;AttachDbFilename=|DataDirectory|\MyDatabase.mdf;Database=MyDatabaseForTesting;Trusted_Connection=Yes;" ;