PaceMedlem sedan juni 20019 024 inlägg Jo. Eftersom jag endast gör mina databashämtningar via en egen klass så hamnar ju all felhantering där. När jag lägger ut den för allmän beskådning har jag tänkt att skicka alla användare till en viss felsida med något enkelt meddelande, därefter skickas e-post till mig (eftersom felmeddelandena skickas via metoden _ThrowError kan jag välja vad jag vill göra av det på ett enkelt sätt).
Public Function GetDataSet (SqlQuery As String, Optional TableName As String = "datasettable") As DataSet
Dim ds As New DataSet()
[red]Try
Dim Adapter As OdbcDataAdapter = New OdbcDataAdapter(SqlQuery, _Conn)
If TableName <> "" Then
Adapter.Fill(ds, TableName)
Else
Adapter.Fill(ds)
End If
Catch Ex As Exception
_ThrowError("Fel uppstod vid hämtning av DataSet: " & Ex.Message())
End Try[/red]
_QueryCount += 1
Return ds
End Function
På begäran kommer även lite kodsnuttar på hur jag har löst de olika lagrena:
-
Presentationsskitet (aspx-sida) - Här är det vanliga repeaters/datalists, label/literals, textboxar och allt som kan tänkas behöva för att visa och redigera/lägga till data.
-
Codebehind-skiktet (kompilerad dll i namespacet VoodooFilm.AspxPages) - Data binds till aspx. Exempel:
Dim db As New VoodooFilm.Data.Database
Dim ds As DataSet = db.GetDataSet(SqlQuery)
db.Close()
CategoriesRepeater.DataSource = ds
CategoriesRepeater.DataBind()
-
Affärslagret 3A (kompilerad dll i namespacet VoodooFilm.SiteFunctions) - Om det rör sig om komplexa sidor som behöver hämta data via dynamiska SQL-strängar så läggs det här så att man slipper se det på codebehind-sidorna. I kodexemplet ovan (punkt 2) hämtas data direkt från lager 3B eftersom just detta inte är några krångligheter.
Affärslagret 3B (kompilerad dll i namespacet VoodooFilm.Data) - Som metoden överst (GetDataSet) så ligger alla databasfunktioner där.
-
Databas - MySQL.
PMedlem sedan jan. 20012 204 inlägg Dags att dra upp den här tråden igen!
Tycker det är jobbigt att ha samma .dller i flera mappar då de gör samm sak.
Kan man göra något i den här stilen?
"Huvudmapp" - Företagsnamn eller dylikt
- bin
- Projekt1
- bin
- Projekt2
- bin
- Projekt3
- bin
Då har jag speciella dll:er för de olika projekten i bin under varje projekt och sen har jag sådant som alla använder tex dbwrapper, en del funktioner etc i bin under huvudmappen.
Projekten ligger alltså som undermapper i huvudmappen.
1. Hur importerar jag dessa i min namespace och aspx filer, om de ligger en mapp över så att säga?
2. Kan man få tag i en key med information om anslutning till datakälla hur web.config om denna fil ligger i en undermapp?
Håller detta i längden?
erkaMedlem sedan dec. 19996 522 inlägg Kanske ska dunka på med en följdfråga till.
Jag sitter med ett litet problem att jag på vissa aspx sidor använder mig av att hämta data till tex datalist 2 gånger i page load, då ser funktionen ut så här tex
Function GetNewDataSet(strSQL As String)
Try
Dim objDataSet as New DataSet()
Dim objAdapter As New SqlDataAdapter()
objCnn.Open()
objAdapter.SelectCommand = CreateSQLCommand(strSQL)
objAdapter.Fill(objDataSet)
Return objDataSet
Catch Exp as SqlException
throw(Exp)
Finally
objCnn.Close()
objCnn.Dispose()
objCnn = Nothing
End Try
End Function
Om jag då anropar denna funktion via de överliggande lagren 2ggr i pageload så öppnas ju databasen samt stängs 2 ggr. Man borde kanske kunna bygga in någon som detta typ.
Man skickar med en parameter till funktionen som talar om om man ska stänga databasanslutningen eller behålla den öppen, behåller man den öppen kollar man innan man skapar datasetet om den är öppen (hur man nu ska göra det). Går det att åstakomma något liknande eller har jag tänkt helt åt h******* fel.
renholmMedlem sedan apr. 20012 266 inlägg
P skrev:
1. Hur importerar jag dessa i min namespace och aspx filer, om de ligger en mapp över så att säga?
2. Kan man få tag i en key med information om anslutning till datakälla hur web.config om denna fil ligger i en undermapp?
Varje applikation behandlas separat vad jag har förståt. Dvs det går inte att hämta Code-behind filer från något annat ställe än /bin. Försökte bygga ett litet system med flera siter och samma /bin utan att lyckas, testat probing samt att placera .dll:erna i GAC. Men om det bara är affärslogik och dataaccess så borde det nog fungerar. Kanske gjorde jag något fel. Testa gärna....
erka skrev:
Om jag då anropar denna funktion via de överliggande lagren 2ggr i pageload så öppnas ju databasen samt stängs 2 ggr. Man borde kanske kunna bygga in någon som detta typ.
Man skickar med en parameter till funktionen som talar om om man ska stänga databasanslutningen eller behålla den öppen, behåller man den öppen kollar man innan man skapar datasetet om den är öppen (hur man nu ska göra det). Går det att åstakomma något liknande eller har jag tänkt helt åt h******* fel.
Hum, i din data class så kan du göra din connection public så den kan öppnas och stängas utifrån eller göra funktioner för att öppna och stänga. T.ex
data.Open()
data.GetNewDataSet("SELECT * FROM users WHERE user_iq > 0")
data.GetNewDataSet("SELECT * FROM users WHERE user_iq < 0")
data.Close()
eller
data.objCnn.Open()
data.GetNewDataSet("SELECT * FROM users WHERE user_iq > 0")
data.GetNewDataSet("SELECT * FROM users WHERE user_iq < 0")
data.objCnn.Close()
PatrikBMedlem sedan mars 20002 836 inlägg .. eller oxå har du en egenskap i code-behinden som du fyller med ditt dataset EN gång och från den egenskapen fyller du dina olika listor.
cya,
PatrikB
renholmMedlem sedan apr. 20012 266 inlägg Men han säger inte att det är samma värde han vill ha in två gånger :) eller så är jag blind
PatrikBMedlem sedan mars 20002 836 inlägg .... nä det förståss .... man ska nog inte svara på frågor när man "slitit" hela dagen :r
Men, om det är mot sql-server så används väl connection-pooling default? eller?
cya,
PatrikB
erkaMedlem sedan dec. 19996 522 inlägg Tack killar, dock tror jag att jag förklarade lite pissigt
Om ni tar en titt på denna fil jag bifogr så ser ni hur jag öppnar och stänger en connection varje gång funktionen GetNewDataSet anropas ifrån lagret direkt under (det är här mina sqlfrågor ligger bla), detta lager i sin tur anropas av ett annat lager som i sin tur anropas av aspx sidorna i tex page load.
Om jag då vill ha ut 2 datasets i page load och skickar anropar på detta vis
Dim objLayerForum as businessLayerForums = New businessLayerForums
rptListaForum.DataSource= objLayerForum.GetForumTopics(ForumId)
rptListaForum.Databind()
objLayerForum = Nothing
objLayerForum = New businessLayerForums
rptListaInfo.DataSource= objLayerForum.GetForumInfo(ForumId)
rptListaInfo.Databind()
objLayerForum = Nothing
funktionerna GetForumInfo,GetForumTopics anropar lagret där sqlfrågorna ligger, detta sqlfråge lager anropar sen min bifogade fil. Om jag gör på detta sätt så öppnas väll samt stängs connectionen först en gång när jag anropar GetForumTopics samt en gång när jag anropar GetForumInfo, även om connection pooling är påslagen.
Om jag då istället skickar med en parameter och skriver något så här
Dim objLayerForum as businessLayerForums = New businessLayerForums
rptListaForum.DataSource= objLayerForum.GetForumTopics(ForumId,ConnAlive)
rptListaForum.Databind()
objLayerForum = Nothing
objLayerForum = New businessLayerForums
rptListaInfo.DataSource= objLayerForum.GetForumInfo(ForumId,ConnClose)
rptListaInfo.Databind()
objLayerForum = Nothing
och om connAlive är medskickar så tar jag inte med
objCnn.Close()
objCnn.Dispose()
objCnn = Nothing
i funktionen GetNewDataSet i min bifogade fil, jag tar med dem om connClose är medskickat.
Har jag missförstått något kanske
h0lgerMedlem sedan nov. 2002105 inlägg Din connnection kommer att dö då du sätter objLayerForum till Nothing mellan anropen. Vill du att din connection skall fortsätta leva skall du ta bort raderna
objLayerForum = Nothing
objLayerForum = New businessLayerForums
mellan anropen.
Dock ser jag ingen större fördel med att ha det på detta sätt. Skulle snarare rekommendera dig att stänga och öppna när du behöver.
PMedlem sedan jan. 20012 204 inlägg Länge sedan någon srkev i denna tråd så jag drar upp den igen!
Är det någon som använder det här programmet?
http://www.sd.nl/software/
Har testat det lite och det verkar inte så dumt...
Ser onekligen intressant ut.
h0lgerMedlem sedan nov. 2002105 inlägg Verkar bra, skall kolla närmare på den. Tack för tipset!
DinoMedlem sedan sep. 20011 914 inlägg Har ett liten förfrågan. Om ni som har lite mer erfarenhet/kunskap skulle kunna bygga upp en likt nedan modell, alltså utförligt förklara varje skikt, hur det skall användas och allt annat som kan man behöva tänka på. Och sedan kanske göra en ny tråd och sätta upp den tråden under relaterat med text rubriken "asp.net struktur". Skulle vara bra för oss oerfarna. :)
- Presentation Skikt
- Business Logic Skikt
- Business Object Dataaccess Skikt
- Databas
PMedlem sedan jan. 20012 204 inlägg Någon som har kollat mer på LLBLGen, verkar ju onekligen bar om man har rikigt många tabeller.
Jag testade det som hastigast och tyckte programmet verkade väldigt användbart. Dock har jag inte hunnit testa det mer.
Det här med code generators är intressant. Läs gärna den här tråden: http://www.asp.net/Forums/ShowPost.aspx?tabindex=1&PostID=44104
Ett par olika code generators:
LLBLGen
nTierGen.NET
DeKlarit
Active Data Online DataAccess
DeKlarit ser väldigt intressant ut, särskilt att använda i kombination med LLBLGen. nTierGen.NET separerar tydligen koden nåt enormt, en tabell har 8 olika klasser enligt tråden.
CompusaMedlem sedan jan. 20023 327 inlägg Hur är det med validering av formulär? I vilket lager bör man göra detta? Presentationslagret (code behind) eller buisness data layer? Skulle vara intressant att höra ur ni applicerar valideringen detta.
GladhMedlem sedan maj 20012 812 inlägg Oj det var en gammal tråd du hittade :)
Hur är det med validering av formulär? I vilket lager bör man göra detta? Presentationslagret (code behind) eller buisness data layer? Skulle vara intressant att höra ur ni applicerar valideringen detta.
Så när källan som möjligt men ändå med tanke på säkerheten/underhåll... Låter det kryptiskt?
Så här är det. Vid validering av formulär så bör det ske utan onödiga anrop till andra lager. Detta ger dig så fall att alla validering bör ske i ditt formulär (aspx-sida / winform) men... detta ger dig ett annat problem.
Om du använder websidor så kan man gå runt dessa formulär och skicka data direkt till din sidan, det betyder att du MÅSTE validera datan även när du tar emot den i din codebehind. Om det nu är så att du bara skickar denna data vidare till en backend services (typ webservice) så har du nu ytterligare ett ställe till som man kan tillgå direkt (man kan ju nå din webservices från en annan applikation) och det betyder att du måste validera data i din webservice också.
Det betyder att du nu har validering på 3 ställen, detta är perfekt ur säkerhetssynpunkt. Samt att valideringen sker så tidigt som möjligt (redan i HTML-koden) och du slipper onödigt roundtrips till webservern som ändå bara kommer att generera tillbaka att det fanns ett fel i inputen, perfekt va?
Rent ut sagt så suger lösning fet ur underhållssynpunkt, du har helt plötsligt 3 ställen som du skall underhålla om din validering ändras. Vilket kommer att resultera i att dina valideringar kommer att komma ur synk med varandra efter ett tag, då man glömmer att implementeringen förändringar på alla ställen.
Så vad är lösningen då? Tja tyvärr finns det ingen bra lösning på problemet, utan en avvägning från din sida vad du tycker är viktigt.
I vilket fall som helst så måste du kontrollera input data innan du opererar på den, vilket betyder att du måste kontrollera den precis innan du skall opererar på den, i vårt exempel blir det alltså i vår webservice. Detta kommer dock att påverka vår prestanda då vi gör en postback samt ett anrop till en webservice vilket vi kunde undvika om vi kontrollerade redan i HTML-koden. Men då får vi problem med underhållet av valideringsregelerna :)
Så vad är viktigt för dig, bra prestanda eller enkelt att underhålla (alltså validering endast på 1 ställe).
- M
CompusaMedlem sedan jan. 20023 327 inlägg Tack så mycket för ditt utförliga svar. Har tänkt lite på detta under dagen och har kommit fram till följande, när jag ska validera formulär:
1. Klient-validering (Javascript)
2. Server-validering (Codebehind, mer omfattande)
3. Validering i data access-lagret för att undvika osäker/farlig data för databashanteraren.
Vad tror ni om denna lösning? Förmodligen sker även en viss validering i affärslagret. Min tanke är att man har en väldigt simpel validering på klientsidan, sedan kör man en tyngre på serversidan. Grädden på moset är att göra data säker innan den lagras i databasen.