webForumDet fria alternativet

Sökväg till fil

.NET

13 svar · 620 visningar · startad av haagel

Medlem sedan feb. 2006134 inlägg
Frågan#1

Jag behöver ett sätt att ange sökvägen till en fil. Jag bygger en liten webbplats med ASP.NET och använder en Access-databas. Databasen ligger i rooten på mitt projekt. All åtkomst till databasen sker genom en klass.

Hittills har alla mina aspx-sidor också legat under rooten. I min databas-klass angav jag följande "sökväg" till databasen:

HttpContext.Current.Server.MapPath("minDatabas.mdb")

Jag trodde jag hittat en lösning som skulle fungera vart än jag flyttade min webbapplikation. Men när jag skapade sidor i en undermapp till rooten så fungerar det inte lägre.

Så frågan lyder:
Hur kan jag skriva en sökväg som når filen "minDatabas.mdb" som fungerar oavsett var webbsidorna ligger i hierarkin och oavsett var jag flyttar min webbapplikation (t.ex. lokalt eller till ett webbhotell)?

Medlem sedan dec. 20014 239 inlägg
#2

Använd "~/minundermapp/" så ordnar det sig säkert..
"~" är sökvägen till rootkatalogen.

Medlem sedan feb. 2006134 inlägg
#3

Nja, jag får inte det att fungera...

Jag använder ofta "~/" då jag skriver sökvägar till bilder etc. i tagg-attribut (i taggar med runat="server") och det fungerar fint. Men till det här verkar det inte fungera.

Jag ska alltså ha sökvägen till min Access-databas för att använda den i en connection-string:

connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + "~/minDatabas.mdb";

Men det fungerar alltså inte med "~/"...

Nån som har nått mer förslag? :(

Medlem sedan dec. 20014 239 inlägg
#4

Bästa alternativet borde vara att lägga din connectionstring i din web.config
och hämta den därifrån med:

ConfigurationManager.ConnectionStrings["minanslutningsträng"].ToString()
Medlem sedan dec. 19996 721 inlägg
#5

haagel skrev:

connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + "~/minDatabas.mdb";

OLEDB vet inte vad "~" är. Du måste använda Server.MapPath och "~".

Server.MapPath("~/minDatabas.mdb")
Medlem sedan feb. 2006134 inlägg
#6

OLEDB vet inte vad "~" är. Du måste använda Server.MapPath och "~".

Hur gör jag för att använda Server.MapPath? Om jag bara skriver

Server.MapPath("~/minDatabas.mdb");

Så fungerar det inte. Måste jag kanske använda nått speciellt namespace (alltså skriva en "using blabla" längs upp)??

Fick förrut ett tips om att använda

HttpContext.Current.Server.MapPath("minDatabas.mdb")

Detta fungerade så länge alla mina webbsidor låg i rooten coh därmed på samma ställe som min databas. Men när jag nu har sidor i undermappar så fungerar det inte lägre.

HttpContext.Current.Server.MapPath("minDatabas.mdb") står i min klass, som ligger i App_Code. Mina aspx-sidor använder sig av denna klass för att kommunicera med databasen. Men det verkar som att sökvägen som skapas med denna kod i databas-klassen på nått sätt utgår ifrån den aspx-sida som använder databas-klassen. Det är iaf så jag har tolkat det. Hur som helst så fungerar det inte.

Vad gäller Web.config: Vad ska jag skriva för sökväg där? Får jag inte samma problem ändå, bara att jag flyttar problemet till en annan fil? Det är ju en XML-fil så jag kan väl inte hålla på med Server-MapPath där heller?

Det måste vara nån som har löst det här problemet. Det borde återkomma varje gång man gör ett projekt med en Access-databas och vill kunna flytta sin applikation utan att behöva ändra i den.

Hoppas nån vill hjälpa med en lösning! :)

Medlem sedan feb. 2005280 inlägg
#7

Jag har tröttnat på det där och kör med den fysiska sökvägen till .mdb helt enkelt :-) Lagt den i web.config så man lätt kan ändra den.

Medlem sedan juni 20019 024 inlägg
#8

Sökvägen till din databas är fast, det vill säga den ändras inte. Lägg den i web.config. Det är där den hör hemma.

Medlem sedan sep. 20011 914 inlägg
#9

web.config

<connectionStrings>
        <add name="AccessDB"
             connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=[B]{0}[/B]\Data\databas.mdb;User Id=;Password=;"
             providerName="System.Data.OleDb"/>
</connectionStrings>

C#

public static string ConnectionString()
{
   object conn = HttpContext.Current.Cache["connection"];

   if(conn == null)
   {
      string s = ConfigurationManager.ConnectionStrings["AccessDB"].ConnectionString;
      s = string.Format(s, Server.MapPath(""));
      HttpContext.Current.Cache["connection"] = s;
      return s;               
   }
   return (string)conn;
}

vb.net

Public Shared Function ConnectionString() As String
        Dim conn As Object = HttpContext.Current.Cache("connection")
        If (conn = Nothing) Then
            Dim s As String = ConfigurationManager.ConnectionStrings("AccessDB").ConnectionString
            s = String.Format(s, Server.MapPath(""))
            HttpContext.Current.Cache("connection") = s
            Return s
        End If
        Return CType(conn,String)
End Function
Medlem sedan dec. 20014 239 inlägg
#10

Tack Dino att du är med utförlig i dina svar än mig :)

Medlem sedan sep. 20011 914 inlägg
#11

Våra svar är dock olika. Med mitt alternativ så kan man flytta applikationen utan att behöva ändra sökvägen. Nyckelsakerna är placeholdern {0} i söksträngen

...Data Source={0}\Data\databas.mdb;...

och den tomma Server.MapPath

...s = string.Format(s, Server.MapPath(""));...
Medlem sedan feb. 2006134 inlägg
#12

Ok, om vi säger att jag vill köra på modellen att hårdkoda sökvägen i Web.config...

Hur skriver jag en absolut sökväg till min databas när den ligger uppe på mitt webhotell? När jag testar lokalt kan jag ju skriva "E:\\osv...", men hur skriver jag när den ligger uppe på en server?

Jag har Loopia som webhotell om det är till någon hjälp...

Medlem sedan juni 20019 024 inlägg
#13

haagel skrev:

Hur skriver jag en absolut sökväg till min databas när den ligger uppe på mitt webhotell? När jag testar lokalt kan jag ju skriva "E:\\osv...", men hur skriver jag när den ligger uppe på en server?

På samma vis. Ta reda på sökvägen genom följande rad:

<%= Request.PhysicalPath %>
Medlem sedan feb. 2006134 inlägg
#14

Tack för hjälpen alla! :)

Jag körde med en fast sökväg i Web.config till slut. Blev minst krångel så...

Tack igen! :)

267 ms totalt · 4 externa anrop · v20260731065814-full.868a69e5
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
117 ms — ändringar (db)