Avatar billede sandrasmurf Nybegynder
12. november 2009 - 14:53 Der er 5 kommentarer og
1 løsning

Håndtering af relative stier

Hej eksperter

Jeg har oprettet en app.config med en ConnectionString sektion. Stien til min Access database er angivet som en relativ sti ud fra devisen 4 mapper op i filhierarkiet fra bin mappen for startup project i min solution og derefter ind i den korrekte data mappe. Min hensigt var, at denne tilgang skulle gøre at flere udviklere kan dele den samme source uden at tænke på stier.

App.config
<connectionStrings>
    <add name="dbfConn" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\..\..\..\Client.LocalDatabase\mydb.mdb;Persist Security Info=False"
providerName="System.Data.OleDb" />
  </connectionStrings>

Mit program indeholder en masse views, der loades gennem OleDB som følger:
ConnectionStringSettings settings = ConfigurationManager.ConnectionStrings["dbfConn"];
string connectionString = settings.ConnectionString;
OleDbConnection connection = new OleDbConnection(connectionString);

Mit problem er, at efter jeg har brugt en OpenFileDialog control, så virker ovenstående ikke mere. Det ser ud til, at OleDB forsøger at åbne databasen ud fra det sted, hvor OpenFileDialog var sidst. Hvis jeg ikke har brugt OpenFileDialog, så virker alt efter hensigten.

Er der nogen som kan udrede for mig, hvordan man så kan bruge relative stier i app.config? Hvordan konverterer OleDBConnection fra relative til absolutte stier.
Avatar billede Slettet bruger
12. november 2009 - 15:20 #1
Hej.

Det er fordi den process, din application kører i skifter working directory, når du browser i en file dialog.

Jeg har fundet denne kodestrimmel, som du kan prøve at eksperimentere med (http://msdn.microsoft.com/en-us/library/aa457089.aspx)
string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
Avatar billede sandrasmurf Nybegynder
12. november 2009 - 15:47 #2
Så den bedste måde vil være at sætte Working directory inden man kalder sin OleDBConnection og så lade OleDB "do its magic"???

Alternativt er det er i hvert fald ikke nemt at ændre direkte i sin ConnectionString og forsøge på at konvertere Relativ->absolut sti selv.

string binFolderDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
Directory.SetCurrentDirectory(binFolderDir)

Jeg skal lige overkomme en URI format not supported Exception, før jeg kan afprøve om det er vejen frem. Jeg er ikke helt klar over om Directory.CurrentDirectory modsvarer det du kalder Working Directory.
Avatar billede sandrasmurf Nybegynder
12. november 2009 - 16:00 #3
Allright, så spiller det vidst.

Det ser ud til, at man godt kan slippe afsted med at sætte WorkingDir med din kodestump, hver gang man har lyst til at snakke med sin database gennem OleDB.

Path.GetDirectoryName giver stien til bin-debug mappen, men der står "file:\", foran stien, så efter jeg smed en remove kommando på kaldet lykkedes det at sætte stien korrekt.

string binFolderDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase).Remove(0, 6);

Directory.SetCurrentDirectory(binFolderDir);

Herefter kan databasen findes ud fra den relative sti.

Tak for hjælpen. Kast et svar :-)
Avatar billede Slettet bruger
12. november 2009 - 18:04 #4
Den løsning er ikke tråd sikker.

Hvis file dialog ændrer working directory mellem du sætter working directory og opretter din connection, vil processen igen stå i en forkert mappe.

Eks:
Directory.SetCurrentDirectory(binFolderDir);
// her ændrer file dialog working directory i en anden tråd
createConnection(); //pseudokode for at forbinde til databasen

Det er meget usandsynligt, det kommer til at ske.

For at undgå det, kan du benytte stien:
System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\..\..\..\..\Client.LocalDatabase\mydb.mdb"

Men det kræver, du kan ændre din connection string ved runtime.
Hvis du vil forsøge at ændre den, skal du være velkommen til at komme med problematikker, der måtte opstå her - så kan jeg forsøge at hjælpe.

Hvis der aldrig vil opstå en situation, hvor en file dialog benyttes samtidig med der forbindes til databasen, vil du ikke opleve problemer.

Her er et (måske midlertidigt) svar :)
Avatar billede sandrasmurf Nybegynder
13. november 2009 - 11:15 #5
Jeg kan godt se problemstillingen angående multi-trådede miljøer.

Det er dog ikke et problem indtil videre i min applikation, da jeg kun kører single trådet indtil videre - kaldene til databasen er ikke så dyre, at jeg har ville arbejde med at køre dem trådet.

Hvis man skulle sikre sig mod fremtidige problemer, så ville det være oplagt at kigge på at generere sin connectionstring dynamisk ud fra din kodestump.

Så jeg holder mig indtil videre til logikken og deler point ud for hjælpen :-)

Er det her måden at konvertere fra relativ til absolut path eller er det pseudo kode:

System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\..\..\..\..\Client.LocalDatabase\mydb.mdb"
Avatar billede Slettet bruger
13. november 2009 - 16:09 #6
System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\..\..\..\..\Client.LocalDatabase\mydb.mdb"
Er ikke testet, men jeg vil tro det fungerer.

.. (parent directory) og . (current directory) notationerne kan nemlig også smækkes ind i en absolut sti. Her er et eksempel:


C:\Program Files\Adobe\              = C:\Program Files\Adobe\
C:\Program Files\Adobe\..\            = C:\Program Files\
C:\Program Files\Adobe\..\Adobe\      = C:\Program Files\Adobe\
C:\Program Files\Adobe\..\Adobe\.\    = C:\Program Files\Adobe\
C:\Program Files\Adobe\..\Adobe\.\..\ = C:\Program Files\
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester