webForumDet fria alternativet

function som öppnar databas

34 svar · 847 visningar · startad av voigtann1

voigtann1Medlem sedan juni 20018 810 inlägg
#1

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

SebbeMedlem sedan jan. 20031 603 inlägg
#2

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")
voigtann1Medlem sedan juni 20018 810 inlägg
#3

*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

CalevanMedlem sedan maj 20031 133 inlägg
#4

just ordet path kan vara kännsligt att använda, men byt ut det mot strpath så bör det funka tror jag!

LR^evil.sidMedlem sedan maj 2002552 inlägg
#5

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
voigtann1Medlem sedan juni 20018 810 inlägg
#6

Ä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.... :(

@ndersMedlem sedan juni 200026 914 inlägg
#7

Har du kallat på funktionen då??

set conn = db("dindb.mdb")
voigtann1Medlem sedan juni 20018 810 inlägg
#8

@nders... då fungerade det... det går inte att bara få db("dindb.mdb").... man måste alltså ha set conn = ... koden?

@ndersMedlem sedan juni 200026 914 inlägg
#9

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.

voigtann1Medlem sedan juni 20018 810 inlägg
#10

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

@ndersMedlem sedan juni 200026 914 inlägg
#11

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

voigtann1Medlem sedan juni 20018 810 inlägg
#12

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?

OveRRidEMedlem sedan feb. 20018 509 inlägg
#13

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?

@ndersMedlem sedan juni 200026 914 inlägg
#14

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"
voigtann1Medlem sedan juni 20018 810 inlägg
#15

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

@ndersMedlem sedan juni 200026 914 inlägg
#16

voigtann1 skrev:

så är vi tillbaka till samma problem som i början igen...

Vilket var?

voigtann1Medlem sedan juni 20018 810 inlägg
#17

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 :)

@ndersMedlem sedan juni 200026 914 inlägg
#18

Objekt krävs.:'conn'

Du noterade att jag bytte namn på conn till objConn? Byt tillbaka om du vill, men ungersk notation for president.

LR^evil.sidMedlem sedan maj 2002552 inlägg
#19

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 Sub

Eller?

Ä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?

doggelitoMedlem sedan juni 20003 100 inlägg
#20

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?

Genererad på 377 ms · cache AV · v20260730165559-full.f96bc7eb