Anslut databas med ado via vb/asp
Förord
Det har frågats många gånger i forumet hur man egentligen gör för att ansluta med ADO till en databas utan att använda ADO's datakontroll (adodc1). Här följer nu tre exempel som du kan använda lite beroende på dess förutsättningar. Jag skall kortfattat försöka förklara skillnaderna på dessa tre varianter och kommer slutligen även visa anslutningen till en databas via ASP.Innehåll
»»
»
»
»
»
»
Introduktion om ADO
Det har frågats många gånger i forumet hur man egentligen gör för att ansluta med ADO till en databas utan att använda ADO's datakontroll (adodc1). Här följer nu tre exempel som du kan använda lite beroende på dess förutsättningar. Jag skall kortfattat försöka förklara skillnaderna på dessa tre varianter och kommer slutligen även visa anslutningen till en databas via ASP.Först skall vi ta och bygga upp en modul som innehåller två subrutiner, dels den rutin som initierar och ansluter till databasen och sedan ytterligare en subrutin som där frigör minnet och stänger anslutning och objekten efter sig.
Först börjar vi med att skapa ett nytt projekt och det gör du genom att starta Visual Basic 6. Du väljer ett nytt standard exe-projekt och det är direkt dags att börja lägga till en referens till ADO. Det gör du genom att se exemplet på denna bilden:
Därefter väljer du ut att referera till Microsoft ActiveX Data Objects 2.6 Library. Microsoft släpper löpande versioner av ADO. För närvarande är ADO 2.7 den senaste versionen som du kan hämta hem från Microsofts hemsida.
Här kan tänkas att du inte har 2.6, då får du använda dig av 2.1 eller senare För att få den senaste versionen av ADO så finner du den alltid på Microsoft’s hemsida (www.microsoft.com/data/download) eller via menyn systemdokument/servicepacks. Installationspaketet kallas MDAC_TYP.EXE och finns i flera versioner och språk. Om du exempelvis hämtar den svenska versionen så kommer de felmeddelanden som uppdagas att presenteras på svenska istället för engelska.
Module1.bas
När denna referens är adderad så kan vi börja skriva programkoden för vårt program. Innan vi börjar så kan jag även säga att om du via components väljer Microsoft ADO kontrollen, placerar den på din form och sedan tar bort den från formen igen – så sätts denna referens automatiskt i projektet. Det kan även finnas fördelar med att lägga till denna ADO kontroll. Anledningen är att du med den kan bygga din connectionsträng och när den fungerar – klipper du ut dess kod och använder den i projektet – på så sätt använder du guiden för att verkligen göra en korrekt anslutning.Nu är det i alla fall dags att böra skriva lite kod. Vi börjar med att deklarera con och rst globalt. Detta för att vi skall kunna anropa dessa referenser från alla våra former. Den andra anledningen är att du automatiskt får upp guiden när du refererar till dessa objekt (hjälpen över alla dess egenskaper).
Global con As ADODB.Connection
Global rst As ADODB.Recordset
Vi ska nu börja med att skriva subrutinen som vi sedan kommer att kalla på när programmet startar. Rutinen behöver endast köras en gång, men om det är programvaror som under en längre tid är inaktiva - skall man stänga connection och åter öppna den när den är dags att användas.
Public Sub InitADO()
Set con = New ADODB.Connection
Set rst = New ADODB.Recordset
Därefter är det dags att presentera och bygga upp vår anslutningssträng - connectiontring som vi skall använda för att ADO skall finna till datakällan.
' access eller sql med dsn
ConnectionString = "DSN=sample;uid=guest;pwd=demo"
' access utan dsn
ConnectionString = "DRIVER={Microsoft Access Driver (*.mdb)};" & _
"DBQ=c:\inetpub\sample.mdb"
' sqlserver utan dsn
ConnectionString = "Provider=SQLOLEDB.1;" & _
"Persist Security Info=False;” & _
"User ID=sa;" & _
"Initial Catalog=Northwind;" & _
"Data Source=pelle"
Ovan ser du tre anslutningsvarianter – du måste välja den typ som passar dig. Är det ingen av ovanstående så föreslår jag att du med adodc1 kontrollen bygger en egen connectionsträng som du sedan klipper in här när den fungerar.
Nu öppnar vi anslutningen genom att skicka med connectionsträngen till funktionen .Open
' öppnar anslutningen
On Local Error Resume Next
con.Open ConnectionString
Efter att du försökt ansluta till databasen så tillåter vi programmet att göra fel utan att stanna, detta gör vi för att kontrollera om allting gick bra.
If con.Errors.Count > 0 Then
MsgBox "anslutningen misslyckades!" & vbCrLf & _
con.Errors(0).Description
ClearADO
End
Else
MsgBox "du är ansluten till databasen"
End If
End Sub
Nu är det bara den subrutin som behövs för att stänga av connection mot databasen. Då skriver du enligt följande:
Public Sub ClearADO()
Set rst = Nothing
Set con = Nothing
End Sub
Form1.frm
Då är det dags att testa programmet och det gör vi genom att i form1 lägga till följande kommando. När du är klar, tryck på F5 och se om du nu kan ansluta till din databas.
Private Sub Form_Load()
' starta connection
InitADO
' stäng connection
ClearADO
End Sub
Nu är programmet igång, du har anslutit mot din databas och nu är det dags att börja använda detta. Nu kan du på alla former använda rst och con för att arbeta mot din databas.
Active Server Pages
Avslutningsvis tänkte jag visa hur man gör i ASP - för det är så liten skillnad att ni skall förstå att man kan använda exempel från ASP även till Visual Basic och vise versa.
<%
' ansluter till min datakälla
set con = server.createObject("ADODB.Connection")
conStr = "Driver={Microsoft Access Driver (*.mdb)};DBQ=" & _
Server.MapPath("sample.mdb")
con.open conStr
' hämtar datat
set rst=con.execute("select id, text from lista")
' stänger connection och frigör minnet
set rst = nothing
set con = nothing
%>
För att lista igenom de poster som du fått i ditt recordset så använder du samma teknik för både asp och VB:
<%
' hämtar och presenterar data från rst
set rst=con.execute("select id, text from lista")
Do While Not rst.EOF
' asp
Response.Write rst("id") & "," & rst("text") & "
"
' vb
List1.Additem rst("id") & "," & rst("text")
rst.MoveNext
Loop
%>
Addera post(er)
Om vi fortsätter nu så har vi hämtat poster med en select-sats. Om vi nu tittar på nästa kommando - insert för att lägga till poster.
sql = "insert into lista (text, gata, nummer) values('test','kamgatan',3)
Denna sqlsats adderar data till 3 fält, text, gata och nummer. Text och gata är characterfält och därför skall de omges med ' ', medan nummer är ett numeriskt fält och behöver därför inte omslutas med ' '. Genom att bygga sql-satsen innan vi kör den kan vi också säkerställa att allt ser bra ut genom att skriva:
<%
text = request.form("text")
gata = request.form("gata")
nummer = request.form("nummer")
sql = "insert into lista (text, gata, nummer) values(" & _
"'" & text & "'," & _
"'" & gata & "'," & _
"'" & nummer & "'"
response.write sql
response.end
%>
Det som händer här är att sql-satsen byggs ihop för att användas. Men istället för att köra den så verifierar vi den genom att skriva ut det på skärmen och sedan avsluta programmet. Om inte sql-satsen ser korrekt ut, har vi slarvat och måste rätta till detta. Ser det däremot bra ut - så är det dags att addera posten:
<%
text = request.form("text")
gata = request.form("gata")
nummer = request.form("nummer")
sql = "insert into lista (text, gata, nummer) values(" & _
"'" & text & "'," & _
"'" & gata & "'," & _
"'" & nummer & "'"
con.execute sql
%>
Ovan ser du att det inte står: set rst = con.execute .. Anledningen är att om du kör insert, update eller delete så returneras ju inga poster. Då är det ju också onödigt att försöka returnera ett recordset som är tomt.
Radera post(er)
Om du skall radera en eller fler poster gäller samma sak, du bygger ihop din sql-sats och sedan kontrollerar du den innan du kör. En vanlig delete-sats kan se ut så här:
sql = "delete from lista where nummer > 50"
Oftast raderar man ju inte alla poster utan kanske en eller några stycken och med where-kommandot bestämmer du det kriteria som du behöver.
<%
nummer = request.form("nummer")
if nummer > 0 then
sql = "delete from lista where nummer > " & nummer
con.execute sql
else
response.write "Du måste ange från vilket nummer " & _
"som poster skall raderas."
end if
%>
Uppdatera post(er)
Om man skall uppdatera en eller flera poster används oftast också en where-sats för att bestämma vilken eller vilka poster som skall uppdateras och med vad. I detta exempel byter vi ut innehållet på en hel post där postens id är 3.
sql = "update lista set namn = 'pelle', gata = 'hemmagatan', " & _
"nummer = 50 where postid = 3"
För att göra motsvarande kan den syntaxen se ut som följer:
<%
id = request.form("id")
text = request.form("text")
gata = request.form("gata")
nummer = request.form("nummer")
if id > 0 then
sql = "update lista set namn = " & _
"'" & namn & "'," & _
"'" & gata & "'," & _
"'" & nummer & "' " & _
"where postid = " & id
con.execute sql
else
response.write "Du måste ange vilke post " & _
"som skall uppdateras."
end if
%>
Nu har du sett insert, update, delete samt select. Detta är de 4 vanligaste sätten att arbeta med just databasfrågor. Många har problem med att köra update, insert och delete men inte select. Oftast beror det då på att du inte ställt in så att databasen är skrivbar för samtliga användare på din webbserver - använd filhanteraren och fixa till det.
Om du är mer van att använda dig av funktioner såsom rst.AddNew och liknande - titta då på artiklarna ovan som denna artikel relaterar till.
Mycket nöje
/Pelle Johansson
Anja Person
Hejsan! Jag har nu provat ditt exempel i flera olika omgångar men kommer alltid till samma felmeddelande. "Drivrutins SQLSetConnectAttr misslyckades." Har du möjligtvis en lösning på detta?