Jag har ett problem med en ASP.Net-applikation som har en admindatabas och ett flertal företagsdatabaser. I inloggningen så väljer man vilket företag man vill jobba mot och connectionsträngen till företagsdatabasen anpassas efter detta. I web-configen sparar jag bara connectionsträngen till admindatabasen och ersätter sedan admindatabasens namn med namnet på den företagsdatabas som användaren loggat in på för att skapa connectionsträngen till företagsdatabasen. Connectionsträngen eller strängarna bör du lägga i web-config och sedan via ditt datalager hämta dessa efter behov. Tänk bara på att använda samma connectionsträngar för dina databaser så du inte blir av med connectionpoolingen. Hej Pelle, Det gick visst att komma åt session-objektet ifrån datalagret. Tydligen gör man så här :Databasanslutningar till flera databaser
Nu till mitt bekymmer; Min första tanke var att lägga företagsconnectionsträngen i en variabel (shared) nere i datalagret (flerskiktad applikation) men i en webbapplikation så innebär detta uppenbarligen att ALLA användare delar den variabeln, så den lösningen håller inte. Så fort en annan användare loggar in på ett annat företag så kommer den första användaren sedan att skriva ned och läsa data från fel databas.
En annan variant är ju att lagra företagsdatabasens namn eller hela connectionsträngen i en session-variabel, men den kommer man ju inte åt i datalagret!? Och att skicka med denna ned till varenda funktion genom alla lager är oacceptabelt tycker jag.
Finns det något sätt att komma åt eller lagra session-specifika uppgifter i datalagret så att man slipper skicka ned parametrar hela vägen ner i alla funktioner?Sv: Databasanslutningar till flera databaser
Sv:Databasanslutningar till flera databaser
Jag har nog inte beskrivit problemet helt tydligt. Connectionsträngen till admindatabasen (som är den enda "kända" databasen) ligger i web.config. Utöver denna har jag en eller flera företagsdatabaser vars connectionsträngar jag får fram genom att ersätta databasnamnet i adminconnectionsträngen. Detta är inget bekymmer.
Problemet ligger egentligen i att jag i datalagret inte har tillgång till t ex Session-objektet, så därför vet jag inte där vilket företag användaren är inloggad på. I en windowsapplikation (WinForms) hade jag lagt connectionsträngen i en shared variabel i datalagret, och satt värdet på denna efter inloggningen, men gör jag samma sak i en webbapplikation så delas ju variabeln av alla användare vilket inte är vad jag vill. Olika användare kan ju vara inloggade på olika företag vid samma tidpunkt så att lagra connectionsträngen till företagsdatabasen i en shared variabel fungerar ju helt enkelt inte eftersom denna inte blir session-specifik eller användarspecifik.
Så, ett alternativ är ju att lagra företagsnamn och/eller connectionsträngen i en Session-variabel och sedan vid varje databasanrop skicka det hela vägen ned till datalagret (lämpligen i konstruktorn till varje klass i respektive lager, inte i varje funktion), men det är detta som känns lite omständigt. Det borde väl finnas en enklare lösning? Man kan väl inte komma åt värdet i en session-variabel ifrån datalagret?
Så här i efterhand önskar jag att vi haft EN enda databas i stället för att separera dem per kund/företag men det går inte att ändra just nu. Då hade det ju varit trivialt att spara connectionsträngen i web.config.Sv: Databasanslutningar till flera databaser
<code>
Imports System.Web.HttpContext
Protected Shared mConnectionStrings As Hashtable = New Hashtable
Public Shared Property ConnectionString() As String
Get
Dim companyID As Integer = CType(System.Web.HttpContext.Current.Session("CompanyID"), Integer)
Return mConnectionStrings.Item("Company" & companyID.ToString).ToString
End Get
Set(ByVal Value As String)
Dim companyID As Integer = CType(System.Web.HttpContext.Current.Session("CompanyID"), Integer)
If Not mConnectionStrings.ContainsKey("Company" & companyID.ToString) Then
mConnectionStrings.Add("Company" & companyID.ToString, Value)
End If
End Set
End Property
</code>
Problemet löst...