2008-09-24 5 views
14

Est-il possible de spécifier une référence de chemin relatif dans la propriété connectionsDing, attachDbFileName dans un fichier web.config?Référence de chemin relatif dans WebConfig.ConnectionString

Par exemple, dans ma base de données se trouve dans le dossier App_data, je peux facilement spécifier le nom de fichier AttachDB en tant que | DataDirectory | \ mydb.mdf et le répertoire | Datadirectory | va automatiquement résoudre le chemin correct. Supposons maintenant que le fichier web.config se trouve dans le dossier A, mais que la base de données se trouve dans le dossier B \ App_data, où le dossier A et B se trouve dans le même dossier. Est-il de toute façon d'utiliser la référence de chemin relatif pour résoudre le chemin correct?

Répondre

10

Cela dépend de l'endroit où votre '| DataDirectory |' est situé. Si la valeur résolue de '| DataDirectory |' est dans le dossier A (où est le web.config), alors non - vous ne pouvez pas spécifier un chemin relatif qui n'est pas un sous-dossier de la valeur résolue de '| DataDirectory |'.

Qu'est-ce que pouvez faire est la valeur de '| DataDirectory |' pour être là où vous le souhaitez, en appelant la méthode AppDomain.SetData.

De la documentation MSDN en ligne:

Lorsque DataDirectory est utilisé, le chemin du fichier résultant ne peut pas être plus élevé dans la structure de répertoire que le répertoire pointé par la chaîne de substitution. Par exemple, si le répertoire DataDirectory entièrement développé est C: \ AppDirectory \ app_data, l'exemple de chaîne de connexion illustré ci-dessus fonctionne car il se trouve sous c: \ AppDirectory. Toutefois, tenter de spécifier DataDirectory en tant que | DataDirectory | .. \ data entraînera une erreur car \ data n'est pas un sous-répertoire de \ AppDirectory.

Espérons que cela aide.

0

Dans IIS, vous pouvez également créer un répertoire virtuel qui pointe vers où la base de données réelle est conservée. Ensuite, votre chaîne de connexion fait simplement référence au répertoire virtuel.

15

J'ai eu le même problème avec le scénario suivant: Je voulais utiliser la même base de données que l'application de mes tests d'intégration.

Je suis allé avec la solution suivante:

Dans le App.config de mon test-projet, j'ai:

<appSettings> 
    <add key="DataDirectory" value="..\..\..\BookShop\App_Data\"/> 
</appSettings> 

Dans le test-setup j'exécute le code suivant:

var dataDirectory = ConfigurationManager.AppSettings["DataDirectory"]; 
    var absoluteDataDirectory = Path.GetFullPath(dataDirectory); 
    AppDomain.CurrentDomain.SetData("DataDirectory", absoluteDataDirectory); 
+0

Merci beaucoup! M'a sauvé tellement! –

1

Ajouter les attributs suivants à la méthode d'essai:

[DeploymentItem("..\\TestSolutionDir\\TestProjedtDir\\TestDataFolder\\TestAutomationSpreadsheet.xlsx")] 
[DataSource("System.Data.Odbc", "Dsn=Excel Files;dbq=|DataDirectory|\\TestAutomationSpreadsheet.xlsx", "SpreadsheetTabName$", DataAccessMethod.Sequential)] 

La variable |DataDirctory| est définie par le système lors de l'exécution du test. DeploymentItem copie la feuille de calcul à cet endroit. Vous pointez sur la feuille de calcul et sur l'onglet de la feuille de calcul dont proviennent les données. Faites un clic droit sur l'onglet pour le renommer en quelque chose de facile à retenir.

Questions connexes