Avatar billede johny Nybegynder
13. juni 2008 - 17:26 Der er 20 kommentarer og
1 løsning

Path til Access (mdb) database - Visual Studio

For blot at vise lokalt hvad min hjemmeside kan, har jeg lavet en access database til den, der så kan sendes med projektet rundt, så jeg lettere kan flytte den.

Problemet for mig nu er så imidlertid, at jeg ikke ved hvordan jeg kan lave en relationel sti til den, da jeg, pga. det mønster jeg bruger, er nød til at tilgå databasen fra et andet projekt der er tilknyttet i form af et class library.

Så som det ser ud nu, så har jeg min access fil liggende i min App_Data mappe, men der hvor jeg skal kalde den fra, er et projekt som jeg tilføjede til solutionen og byggede fra bunden. Det ser dog umiddelbart ud til, at den har lagt sig i /Visual Studio 2008/projects/"solution navn"/"projekt navn".

Jeg ved desværre ikke så meget om hvordan det er Visual Studio 2008 placerer sine filer, og ved derfor slet ikke hvordan jeg skal sætte en relationel sti op.

Er der nogen der har nogle gode råd? :)
Avatar billede arne_v Ekspert
15. juni 2008 - 20:47 #1
Hvorfor ikke insistere på at MDB filen skal ligge i samme dir som EXE filen ?

Så kan du bruge:

Path.Combine(Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]), "foobar.mdb")
Avatar billede johny Nybegynder
15. juni 2008 - 23:20 #2
Fordi jeg netop har to projekter der begge benytter sig af filen. Det ene projekt er min webside, og det andet er et class library, som det første projekt har liggende i en bin mappe.. Så det ved jeg ikke lige hvordan jeg skulle gøre?
Avatar billede arne_v Ekspert
15. juni 2008 - 23:36 #3
Du kan også angive en relativ sti i en web app med Server.MapPath().

En anden mulighed er at angive placeringen i web.config / app.config.
Avatar billede johny Nybegynder
16. juni 2008 - 08:24 #4
Jamen hvordan finder jeg den i mit class library? Det er der problemet er. I min webside ligger det jo i min AppData, og der er der ingen problemet, men det er når jeg skal kalde den fra mit class library, at jeg har været nød til at angive en absolut sti, hvilket jeg meget gerne vil undgå. Hvordan finder jeg frem til AppData fra et andet projekt i den samme solution?
Avatar billede arne_v Ekspert
17. juni 2008 - 03:19 #5
Hvis dit class library bruges af din web app, så vil class library vel have samme
app_data som web app og kunne tilgåes på samme måde ??
Avatar billede johny Nybegynder
17. juni 2008 - 06:49 #6
Hmm, den metode skal jeg vel bruge i code behind? Hvordan kombinerer jeg så det med min web.config? Undskyld at jeg er lidt sløv, men ved desværre ikke for meget om web endnu...
Avatar billede arne_v Ekspert
22. juni 2008 - 04:54 #7
At hente config fra web.config er vel normalt at lave i code behind !?!?
Avatar billede arne_v Ekspert
29. august 2008 - 02:37 #8
OK ?
Avatar billede johny Nybegynder
31. august 2008 - 14:22 #9
Ah, det må du undskylde Arne, kom helt fra det her spørgsmål igen. Men jeg tror jeg har blandet lidt rundt i begreberne, for det du foreslår, kan så vidt jeg kan se, ikke lade sig gøre. Jeg prøver lige igen:

Jeg har én solution med 2 projekter i. Den ene er et class library og database facade, som er deri jeg skal have linket til databasen, når jeg skifter min mdb fil ud med en egentlig database. Og det andet projekt er så det selv hjemmesiden ligger i.

Mit problem er så, at jeg har brugersystemet (det integrerede i .NET) og mine egne tabeller i den samme database. Lige pt. ligger mdb filen så i en mappe i hjemmesideprojektet, og det er den mappe jeg så skal kunne henvise til fra min database facade. Det jeg så gerne vil have, er en relationel sti. Hvordan kan jeg lave det fra min db facade?
Avatar billede arne_v Ekspert
31. august 2008 - 18:30 #10
Hvis dit library projekt altid deployes med dit web projekt, så er den nemmeste
løsning at gemme det i web.config - den vil kunne tilgåes både fra kode i web projekt
og library projekt.

Hvis dit library projekt også skal kunne bruges i andre sammenhænge, så kan du
evt. lade koden deri teste om det er en web app og så bruge web.config
og ellers app.config.
Avatar billede johny Nybegynder
31. august 2008 - 21:08 #11
Jamen hvordan tilgår jeg web.config fra et class library der jo ikke ved at den er inkluderet i et andet projekt? Jeg mener, jeg skal jo bruge connectionstring til mit connection objekt, og hvordan får jeg fat i den i mit class library?
Avatar billede arne_v Ekspert
02. september 2008 - 02:26 #12
Du tilgår den vel på præcis samme måde via ConfigurationManager uanset i hvilken
assembly koden ligger I ??
Avatar billede johny Nybegynder
04. september 2008 - 22:22 #13
Hmm, der er åbenbart noget helt basisk her jeg ikke aner et klap om, for jeg kan simpelthen ikke se hvad det er jeg skal gøre?

Jeg har to forskellige projekter der ligger i den samme rod mappe. 1 class library og 1 website. I den ene ligger der en fil som jeg skal have adgang til i den anden. Ind til videre har jeg kun fået det til at virke ved at indtaste den absolutte sti til filen, men jeg vil gerne benytte mig af en relationel sti, så jeg kan flytte det rundt senere.

Det der forvirrede mig var, at hjemmesiden, når den blev kompileret, blev lagt i en mappe jeg ikke selv havde udpeget, men noget som visual studio gjorde på egen hånd (ind i dokumenter/visual studio 2008/projektnavn), og jeg derfor slet ikke har styr på hvordan filstrukturen egentlig er. Altså, med andre ord, også hvordan de to projekter så kommer til at ligge i forhold til hinanden. Men det har måske ikke noget med sagen at gøre?

Og nej, jeg tilgår den ikke via ConfigurationManager?

Beklager de mange spørgsmål, men jeg er stadig ret grøn når det kommer til hjemmesider.. :$
Avatar billede arne_v Ekspert
05. september 2008 - 04:56 #14
Hvis du ikke bruger ConfigurationManager - hvordan får du så fat i den connection string
fra web.config ?
Avatar billede johny Nybegynder
05. september 2008 - 16:11 #15
Det eneste jeg bruger db'en til direkte i projektet (altså uden om class library'et) er Membership, og det har jeg sat op i Web.config, og jeg tilgår derfor aldrig min connectionString andet end fra web.config selv.

Her er koden fra web.config:

<membership defaultProvider="ACProvider">
  <providers>
    <clear/>
    <add name="ACProvider"
type="Samples.AccessProviders.AccessMembershipProvider, AccessProvider"
connectionStringName="LocalAccessDatabase"
enablePasswordRetrieval="true"
enablePasswordReset="true"
requiresUniqueEmail="true"
requiresQuestionAndAnswer="false"
minRequiredPasswordLength="5"
minRequiredNonalphanumericCharacters="0"
applicationName="/AncientConflicts"
passwordAttemptWindow="10"
maxInvalidPasswordAttempts="5"
passwordFormat="Clear"/>
  </providers>
</membership>

"LocalAccessDatabase" er så navnet på min connectionString.
Avatar billede arne_v Ekspert
05. september 2008 - 16:26 #16
Du kan tilgaa den via ConfigurationManager !
Avatar billede johny Nybegynder
06. september 2008 - 12:20 #17
Takker, det anede jeg ikke den kunne bruges til. :) (har kun brugt den til at tilgå en app.settings fil der var inkluderet i samme projekt)

Men jeg får bare en fejl nu? Det her er den connectionstring den får ud af det?

localConnectionString = "data source=.\\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"

Jeg bruger den sådan her:
ConfigurationManager.ConnectionStrings[0].ConnectionString

Er det forkert?
Avatar billede arne_v Ekspert
06. september 2008 - 15:49 #18
Hvilken fejl får du ?
Avatar billede johny Nybegynder
06. september 2008 - 16:08 #19
System.ArgumentException was unhandled by user code
  Message="An OLE DB Provider was not specified in the ConnectionString.  An example would be, 'Provider=SQLOLEDB;'."
  Source="System.Data"
  StackTrace:
      at System.Data.OleDb.OleDbConnectionString.ValidateProvider(String progid)
      at System.Data.OleDb.OleDbConnectionString.ValidateConnectionString(String connectionString)
      at System.Data.OleDb.OleDbConnectionString..ctor(String connectionString, Boolean validate)
      at System.Data.OleDb.OleDbConnectionFactory.CreateConnectionOptions(String connectionString, DbConnectionOptions previous)
      at System.Data.ProviderBase.DbConnectionFactory.GetConnectionPoolGroup(String connectionString, DbConnectionPoolGroupOptions poolOptions, DbConnectionOptions& userConnectionOptions)
      at System.Data.OleDb.OleDbConnection.ConnectionString_Set(String value)
      at System.Data.OleDb.OleDbConnection.set_ConnectionString(String value)
      at System.Data.OleDb.OleDbConnection..ctor(String connectionString)
      at easySolutions.Sql.Transaction..ctor(String localConnectionString, DatabaseType dt) in E:\Documents\School\SDP\CoreLibrary\CoreLibrary\Sql\Transaction.cs:line 110
      at DataHandler.Facade.GetNewspair(Int32 currentID) in E:\Documents\Visual Studio 2008\Projects\AncientConflicts\DataHandler\Facade.cs:line 28
      at news_news.Page_Load(Object sender, EventArgs e) in e:\Documents\School\Web\Projekt\BBMMO\AncientConflicts\news\news.aspx.cs:line 21
      at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
      at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
      at System.Web.UI.Control.OnLoad(EventArgs e)
      at System.Web.UI.Control.LoadRecursive()
      at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
  InnerException:
Avatar billede arne_v Ekspert
06. september 2008 - 16:15 #20
Ah.

Den connection string er en SQLServer connection string og kan bruges med en SqlConnection
men ikke med en OleDBConnection !
Avatar billede johny Nybegynder
07. september 2008 - 00:18 #21
Hmm, det virker heller ikke hvis jeg laver det til SqlDBConnection:

System.Data.SqlClient.SqlException was unhandled by user code
  Message="An attempt to attach an auto-named database for file E:\\Documents\\School\\Web\\Projekt\\BBMMO\\AncientConflicts\\App_Data\\aspnetdb.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share."
  Source=".Net SqlClient Data Provider"
  ErrorCode=-2146232060
  Class=14
  LineNumber=65536
  Number=15350
  Procedure=""
  Server="\\\\.\\pipe\\DA33AC12-5940-4B\\tsql\\query"
  State=1
  StackTrace:
      at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
      at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
      at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
      at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
      at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
      at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
      at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
      at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
      at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
      at System.Data.SqlClient.SqlConnection.Open()
      at easySolutions.Sql.Transaction..ctor(String localConnectionString, DatabaseType dt) in E:\Documents\School\SDP\CoreLibrary\CoreLibrary\Sql\Transaction.cs:line 106
      at System.Data.SqlClient.SqlConnection.Open()
      at easySolutions.Sql.Transaction..ctor(String localConnectionString, DatabaseType dt) in E:\Documents\School\SDP\CoreLibrary\CoreLibrary\Sql\Transaction.cs:line 106
      at DataHandler.Facade.GetNewspair(Int32 currentID) in E:\Documents\Visual Studio 2008\Projects\AncientConflicts\DataHandler\Facade.cs:line 28
      at news_news.Page_Load(Object sender, EventArgs e) in e:\Documents\School\Web\Projekt\BBMMO\AncientConflicts\news\news.aspx.cs:line 21
      at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
      at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
      at System.Web.UI.Control.OnLoad(EventArgs e)
      at System.Web.UI.Control.LoadRecursive()
      at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
  InnerException:


Men da jeg bare hardcodede den fulde conncetionstring, der virkede det (med brug af en OleDBConnection), og den så således ud:

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\Documents\School\Web\Projekt\BBMMO\AncientConflicts\App_Data\ASPNetDB.mdb;User Id=admin;Password=;"
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



Seneste spørgsmål Seneste aktivitet
I dag 10:28 PDFEngine Af barth i Andet software
I går 22:40 Butte indhold i celler Af lurup i Excel
I går 15:24 Power Query Af djsimonsen i Excel
I går 14:43 Hvis ikke på liste, tilføj værdier til liste Af TheLibrarian i Excel
I går 11:33 Windows 11 Af ranni i Windows