Jag sitter just nu inne i lumpen och fundera på att göra lite funktioner och andra "bra" saker för personer som är för lata att tex koda egna koder.... problemet som jag har stött på är att jag försöker göra en db(path) funktion (en funktion där path är var db ligger).... kör en typisk kod inne i funktionen för att "öppna" databasen.. men när jag försöker köra ett execute på fälet så står det tex: connect är odefinierat.... har sett denna typ av kod tidigare men hos mig vill den inte fungera... tyvärr har jag ingen kod jag kan visa då vi inte får koppla upp egna datorer här :e ... hoppas det hjälper något med det jag skrivit..
function som öppnar databas
34 svar · 847 visningar · startad av voigtann1
Något sånt här borde väl funka? :)
Function DB(strPath)
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(strPath)
Set DB = objConn
End Function
Set objConn = DB("foo.mdb")
*suck*... varit borta från en dator för länge :e ska testa
Set DB = objConn
När jag kommer tillbaka till loggementet :e annars hör jag av mig imorgon igen :e
just ordet path kan vara kännsligt att använda, men byt ut det mot strpath så bör det funka tror jag!
Jag löser min databaskoppling så här nu för tiden. Nån som har något förslag på hur jag kan förbättra den?
Function SetCon(ByRef oCon, SQL, MkRecSet, CloseCon)
If Not IsObject(oCon) Then Set oCon = Server.CreateObject("ADODB.Connection")
oCon.Open(Application("ADODBConnection"))
Select Case LCase(MkRecSet)
Case True, "true"
Dim oRs: Set oRs = oCon.Execute(SQL)
If Not oRs.EOF Then SetCon = oRs.GetRows() Else SetCon = Empty
Call CloseObject(oRs)
Case Else
oCon.Execute(SQL)
SetCon = Empty
End Select
Select Case LCase(CloseCon)
Case True, "true"
Call CloseObject(oCon)
End Select
End Function
Sub CloseObject(Obj)
Obj.Close: Set Obj = Nothing
End Sub
Är tillbaka nu... den koden gav inget bra resultat(har inte testat koden på senaste svaret).... har bärbara datorn med mig:
function db(strpath)
dim conn
set conn = server.createobject("ADODB.connection")
conn.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(strPath)
set db = conn
end function
Denna kod är i en fil som jag har included på huvudsidan... när jag kör denna SQL kod:
SQL = "Select * from....."
set recset = conn.execute(SQL)
Får jag
Objekt krävs.: 'conn'
.... vill gärna få igång detta.... fast än så länge går det tufft.... :(
@nders... då fungerade det... det går inte att bara få db("dindb.mdb").... man måste alltså ha set conn = ... koden?
Eftersom du har en funktion som skapar, och returnerar ett connectionobjekt, så är det så det fungerar. Objekt som skapas i funktionen är lokala. Om du dimmar conn utanför funktionen kan du använda den som en sub, och då behöver du bara köra den, utan att returnera någonting. Annars kan du ju köra koden bara rakt av i din include, men det var ju en funktion du frågade efter, så jag förstår inte riktigt din sista fråga.
försöker göra lite funktioner som man behöver göra "så lite jobb" själv :e om man säger så. dvs om man bara skriver db("mindb.mdb") så ska den köra hela alltet.. fast man kan ju göra det i include filen kanske?.... får forskar vidare på detta :e
dvs om man bara skriver db("mindb.mdb") så ska den köra hela alltet..
Dvs skapa och tillgängliggöra ett connectionobjekt? Det är inga problem, gör om det till en sub, och deklarera connectionobjektet utanför subrutinen.
fast man kan ju göra det i include filen kanske?....
Är det inte det du håller på och pillar med? :q
Menar med include filen
set conn = db("mindb.mdb")
istället.. men ditt råd är att ändra funktionen till en sub och kör en call db("mindb.mdb") istället och lägg set conn = db("mindb.mdb") efter end sub istället?
evil sid skrev:
Jag löser min databaskoppling så här nu för tiden. Nån som har något förslag på hur jag kan förbättra den?
Borde du inte ha ByRef på din objekt-parameter? Så som det är nu så skickar du ju in ett objekt och som förstörs i sub:en, men inte i funktionen.
Sub CloseObject(ByRef Obj)
Obj.Close: Set Obj = Nothing
End Sub
Eller?
voigtann1 skrev:
men ditt råd är att ändra funktionen till en sub och kör en call db("mindb.mdb") istället och lägg set conn = db("mindb.mdb") efter end sub istället?
Nej, mitt råd:
' i includefilen:
dim objConn
Sub db(strpath)
set objConn = server.createobject("ADODB.connection")
objConn.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(strPath)
End Sub
' sparka igång:
db "dindatabas.mdb"
om jag kör db "db.mdb" i includen eller var som hellst så är vi tillbaka till samma problem som i början igen...
Objekt krävs.:'conn'
Jag tror det räcker för idag :e får inte vara mer på datorerna här längre också :( tack @nders för att få igång koderna igen något bättre än vad det var i början :e sov gott nu grabbar :e PEK imorgon :)
Objekt krävs.:'conn'
Du noterade att jag bytte namn på conn till objConn? Byt tillbaka om du vill, men ungersk notation for president.
OveRRidE skrev:
evil sid skrev:
Jag löser min databaskoppling så här nu för tiden. Nån som har något förslag på hur jag kan förbättra den?
Borde du inte ha ByRef på din objekt-parameter? Så som det är nu så skickar du ju in ett objekt och som förstörs i sub:en, men inte i funktionen.
Sub CloseObject(ByRef Obj) Obj.Close: Set Obj = Nothing End SubEller?
Är inte säker på vilken skillnad det skulle bli om jag satte ByRef på objektet : /
Den subrutinen är till för att skicka in och förstöra de objekt som skickas in. De kan vara vilka objekt som helst. Subrutinen är inte bunden specifikt till databaskopplingsfunktionen. Är det fortfarande fel eller missförstår jag dig?
Beroende på om CloseCon är True eller False skall ADODB-anslutningen hållas öppen så vi slipper återskapa den när jag behöver göra fler än ett anrop till databasen. Det är väl dumt att skapa ett objekt som redan finns?
OveRRide skrev:
Borde du inte ha ByRef på din objekt-parameter? Så som det är nu så skickar du ju in ett objekt och som förstörs i sub:en, men inte i funktionen.
Byref är väl default i asp! (dock inte i asp.net)
LR^evil.sid skrev:
Beroende på om CloseCon är True eller False skall ADODB-anslutningen hållas öppen så vi slipper återskapa den när jag behöver göra fler än ett anrop till databasen. Det är väl dumt att skapa ett objekt som redan finns?
Mja, du skapar ju ett nytt objekt på sidan när du kör funktionen, typ:
Set objCon = ...
Så varför hålla objektet öppet i funktionen?