webForumDet fria alternativet

Databashantering

147 svar · 8 229 visningar · startad av kristoffer · sida 7 av 8

PaceMedlem sedan juni 20019 024 inlägg
#121

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:

  1. 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.

  2. 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()
    
  3. 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.

  4. Databas - MySQL.

PMedlem sedan jan. 20012 204 inlägg
#122

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
#123

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
#124

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
#125

.. 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
#126

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
#127

.... 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
#128

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
#129

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
#130

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...

kristofferMedlem sedan juni 20001 257 inlägg
#131

Ser onekligen intressant ut.

h0lgerMedlem sedan nov. 2002105 inlägg
#132

Verkar bra, skall kolla närmare på den. Tack för tipset!

DinoMedlem sedan sep. 20011 914 inlägg
#133

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
#134

Pace skrev:

  1. Aspx-presentationsskikt - här presenteras alla inlägg, html etc med form av repeaters, datalists och egensnickrade kontroller om så behövs.

  2. Code-behind skikt - denna hämtar datan, alla inläggen, från affärslagret och binder dem till serverkontrollerna. Här görs kontroller på vad, var och hur datan ska skrivas ut på sidan (vanligtvis med If-satser).

  3. Affärslagret - här är alla "globala" funktioner representerade, egentligen är detta uppdelat i "lager" också:

    A) Lagret som kommunicerar med code-behind och retunerar data i form av ett DataSet. Allt som retuneras till code-behinden är i stort sett DataSet, ArrayList eller strängar. Detta lagret kommunicerar i sin tur med:

    B) Det riktiga affärslagret där den "tråkiga" logiken sitter. Här ligger bl a en databasklass som hämtar & kör data genom databasen. Fördelen med detta är att det är enkelt att byta providers från exempelvis Sql till OleDb utan att något annat påverkas.

  4. Datalagret - databasen.

PMedlem sedan jan. 20012 204 inlägg
#135

Någon som har kollat mer på LLBLGen, verkar ju onekligen bar om man har rikigt många tabeller.

kristofferMedlem sedan juni 20001 257 inlägg
#136

Jag testade det som hastigast och tyckte programmet verkade väldigt användbart. Dock har jag inte hunnit testa det mer.

kristofferMedlem sedan juni 20001 257 inlägg
#137

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
#138

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
#139

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
#140

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.

133 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)