Koppla dig mot databas (Access)
Förord
Denna lilla artikel kommer att handla om hur man på olika sätt kopplar sig mot en databas. I detta exempel har jag valt att använda mig av en Accessdatabas och VB som språk. Utan att vara helt säker så tror jag att det mest vanliga sättet är att man skapar sin anslutning och ställer sin fråga mot databasen direkt under det event man väljer att ställa sin fråga tex under Page.Load eller en knapp. Risken som man kan löpa här att man tappar kontrollen på sina uppkopplingar mot sin databas och kanske vid vissa tillfällen rent av glömmer att stänga sin anslutning?! Detta kanske inte är så valigt problem men för att undvika detta kan man i stället använda sig av en klass som tar hand om själva "kopplingen" mot sin databas. känns mer koplicerat men i långa loppet så tror jag att det är det bästa, men jag skall försöka förklara.Innehåll
Vi tänker oss att vi vill binda en datakontroll i detta fall en repeter (skulle givetvis kunna vara en gridview eller något liknande). Vi vill binda denna kontroll vid Page.load, vilket skulle bli enlig:
Detta binder Repeatern med allt från DinTabell. Nackdelen som jag ser det är som sagt att du måste deklarera samma sak nästa gång vid en annan händelse tex vid en Button eller dyligt.
Om vi då tittar på det andra sättet dvs med klasserna så blir det följande.
Det första jag gör är att skapa mig en klass som tar hand om själva "kopplingen". Den kan vi kalla för cAccessConn och ser ut på följande sett:
I detta exemplet kommer jag inte gå in så djupt på vad just klassen gör men som synses så har jag bla. deklarerar ett dataset, en dataadapter samt min sql sträng. Dessa kommer jag alltid att använda då jag vill anropar min klass.
Nästa steg är att skapa en eller flera klasser som tar hand om alla de frågor som du vill göra mot din Accessdatabas. Jag har som regel att jag skapar en klass för varje tabell som jag har i den databas som jag jobbar med.
Vi tänker oss att vi har en Repeater på en sida som kommer att hämta senaste nytt som finns i vår databas. Således tänker vi oss att vi har en tabell som vi kallar News. Som jag sa så har jag som en tummregel att en tabell i min databas är en klass. Därför skapar vi oss en klass som heter cNews enlig:
Lägg märke till att jag ärver våran databasklass, Inherit cAccessConn. Detta för att jag vill komma åt denna klassens innehåll, tex Fill()
Då var det bara en sak kvar och det är i code behind för att binda den Repeater vi har på sidan.
Jag skaper en sub under PageLoad som jag kallar LoadNews(). LoadNews ser ut på följande sätt:
Här deklarerar jag ett objekt av våran nyskapade klass cNews. Genom detta så kommer jag med hjälp av punktnotation åt de funktioner i klassen. Du kan se att med hjälp av vårt objekt kommer åt GetAllNews dvs den sub vi skapade i våran cNews klass.
Som sagt två tillvägagångssätt och jag vet inte vilket du kännner mest för. Jag gissar att den sista tekninken kan kännas lite invecklad och knölig. Men jag lover att du kommer att tycka den är smidigast, särskillt om du har måga frågor mot din databas.
Hoppas att denna lilla artikel kan hjälpa någon!
Lycka till!
Mvh,
Thomas
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Koppling till din databas
Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("./DB/DinDatabas.mdb") & ";"
Dim srtSQL As String = "SELECT * FROM DinTabel "
Dim MyConn As New Data.OleDb.OleDbConnection(strConn)
Dim Cmd As New Data.OleDb.OleDbCommand(srtSQL, MyConn)
MyConn.Open()
DinRepeater.DataSource = Cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection)
DinRepeater.DataBind()
End Sub
Detta binder Repeatern med allt från DinTabell. Nackdelen som jag ser det är som sagt att du måste deklarera samma sak nästa gång vid en annan händelse tex vid en Button eller dyligt.
Om vi då tittar på det andra sättet dvs med klasserna så blir det följande.
Det första jag gör är att skapa mig en klass som tar hand om själva "kopplingen". Den kan vi kalla för cAccessConn och ser ut på följande sett:
Imports Microsoft.VisualBasic
Imports System.Data
Public Class cAccessConn
Private AccessConn As New OleDb.OleDbConnection("Provider = Microsoft.Jet.OLEDB.4.0;Data Source = " & HttpContext.Current.Server.MapPath("./DB/DinDatabas.mdb") & "; Mode=ReadWrite;")
Private ads As New DataSet
Private ada As New OleDb.OleDbDataAdapter
Private aSqlStr As String
Protected ReadOnly Property Con() As OleDb.OleDbConnection
Get
Return AccessConn
End Get
End Property
Public ReadOnly Property ds() As DataSet
Get
Return ads
End Get
End Property
Public Property SqlStr() As String
Get
Return aSqlStr
End Get
Set(ByVal Value As String)
aSqlStr = Value
End Set
End Property
Public Sub Dispose()
AccessConn.Dispose()
ads.Dispose()
ada.Dispose()
End Sub
Public Sub Fill()
Dim Command As New OleDb.OleDbCommand
Command.CommandText = SqlStr
Command.Connection = AccessConn
ada.SelectCommand = Command
AccessConn.Open()
ada.Fill(ds)
AccessConn.Close()
End Sub
Protected Sub ExecNoQuery(ByVal sp As OleDb.OleDbCommand)
AccessConn.Open()
sp.ExecuteNonQuery()
AccessConn.Close()
End Sub
End Class
I detta exemplet kommer jag inte gå in så djupt på vad just klassen gör men som synses så har jag bla. deklarerar ett dataset, en dataadapter samt min sql sträng. Dessa kommer jag alltid att använda då jag vill anropar min klass.
Nästa steg är att skapa en eller flera klasser som tar hand om alla de frågor som du vill göra mot din Accessdatabas. Jag har som regel att jag skapar en klass för varje tabell som jag har i den databas som jag jobbar med.
Vi tänker oss att vi har en Repeater på en sida som kommer att hämta senaste nytt som finns i vår databas. Således tänker vi oss att vi har en tabell som vi kallar News. Som jag sa så har jag som en tummregel att en tabell i min databas är en klass. Därför skapar vi oss en klass som heter cNews enlig:
Public Class cNews
Inherits cAccessConn
Public Sub GetAllNews()
SqlStr = " SELECT Datum, Meddelande " & _
" FROM News " & _
" ORDER BY Datum DESC"
Fill()
End Sub
End Class
Lägg märke till att jag ärver våran databasklass, Inherit cAccessConn. Detta för att jag vill komma åt denna klassens innehåll, tex Fill()
Då var det bara en sak kvar och det är i code behind för att binda den Repeater vi har på sidan.
Jag skaper en sub under PageLoad som jag kallar LoadNews(). LoadNews ser ut på följande sätt:
Public Sub LoadNews()
Dim objMessage As New cNews
objMessage.GetAllNews()
MyRepeater.DataSource = objMessage.ds
MyRepeater.DataBind()
MyRepeater.Dispose()
End Sub
Här deklarerar jag ett objekt av våran nyskapade klass cNews. Genom detta så kommer jag med hjälp av punktnotation åt de funktioner i klassen. Du kan se att med hjälp av vårt objekt kommer åt GetAllNews dvs den sub vi skapade i våran cNews klass.
Som sagt två tillvägagångssätt och jag vet inte vilket du kännner mest för. Jag gissar att den sista tekninken kan kännas lite invecklad och knölig. Men jag lover att du kommer att tycka den är smidigast, särskillt om du har måga frågor mot din databas.
Hoppas att denna lilla artikel kan hjälpa någon!
Lycka till!
Mvh,
Thomas
0 Kommentarer