webForumDet fria alternativet

Odefinierat fel

ASP

18 svar · 862 visningar · startad av SoulGod

Medlem sedan aug. 20051 200 inlägg
Frågan#1

Får följande fel:

Feltyp:
Provider (0x80004005)
Odefinierat fel
/webshop/inc/functions.asp, line 3

Och den raden är:

C.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("databejs.mdb")

Detta problemet kommer när jag försöker gå in på en sida, som då skall hämta information från databasen. Har kontrollerat skriv / läs-rättigheterna, och det är insatt korrekt.

Någon som har en aning?

Medlem sedan juni 200032 967 inlägg
#2

Provat med OLEDB-anslutning?

http://www.connectionstrings.com/

Medlem sedan aug. 20051 200 inlägg
#3

Det löste första problemet.. nu har jag följande:

<% Set C = Server.CreateObject("ADODB.Connection")
--> C.Open "Driver={Microsoft Access Driver (*.mdb)};Dbq=databejs.mdb;"

Vilket ger mig felet

Microsoft OLE DB Provider for ODBC Drivers (0x80004005)
[Microsoft][Drivrutin för ODBC Microsoft Access]Allmänt fel Det går inte att öppna registernyckeln 'Temporary (volatile) Jet DSN for process 0x3ac Thread 0xe04 DBC 0x1377f8c Jet'.
/webshop/admin.asp, line 132

och --> är då line 132... jag som är korkad?

Medlem sedan aug. 20051 200 inlägg
#4

Hittade felet, man var tvungen att skriva adressen C:\ .. o.s.v.

Hur får jag bort det?
Kommer ligga på en webserver där jag ej vet den direkta länken.

Medlem sedan juni 200032 967 inlägg
#5

Du ska använda server.mappath() som i ditt första försök...
Dessutom ser jag inte att du ändrade till OLEDB-anslutning, men det är väl av underordnad betydelse nu.

Medlem sedan jan. 20022 440 inlägg
#6

Det @nders menar är att du ska använda dig av något som det här.

Dim objConn
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _
	& Server.MapPath("\") & "\admin\databas.mdb"

Man ska i största möjliga mån undvika absoluta sökvägar och man ska i största möjliga mån också använda sig av Provider=Microsoft.Jet.OLEDB.4.0; Det fungerar snabbare bättre och säkrare :)

Medlem sedan aug. 20051 200 inlägg
#7

Nu får jag följande fel istället:
Feltyp:
Microsoft JET Database Engine (0x80004005)
Det går inte att använda ''. Filen används redan.
/webshop/admin.asp, line 1332

Det är då alltså databasen den menar (antar jag, rent logiskt)

Jag har aldrig råkat ut för detta förut, varför blir det så?

Medlem sedan juni 200032 967 inlägg
#8

Har du databasen öppen i Access?

Medlem sedan aug. 20051 200 inlägg
#9

Nej, det har jag inte.

Medlem sedan feb. 20011 198 inlägg
#10

Vad görs på rad 1332?

Medlem sedan aug. 20051 200 inlägg
#11
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _
	& Server.MapPath("\webshop\") & "\databas.mdb"
Medlem sedan feb. 20011 198 inlägg
#12

Skapas flera anslutningar mot samma databas?
En på rad 132 och en på 1332?

Medlem sedan aug. 20051 200 inlägg
#13

Rad 132 är i en annan fil, men nu när du säger det, så inkluderas den "andra" filen i samma dokument... Ska visa ett lite större utdrag....

				Set Conn = Server.CreateObject("ADODB.Connection")
				Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _
	& Server.MapPath("\webshop\") & "\databejs.mdb"
				Set RS = Server.CreateObject("ADODB.Recordset")
				SQL = "SELECT sum(amount) as summa, op.aid, p.price, p.product FROM order_products op INNER JOIN products p ON op.aid = p.id GROUP BY aid, p.price, p.product ORDER BY sum(amount) DESC"
				RS.Open SQL, Conn, 1, 3
					If Not RS.EOF Then %>
						Populäraste produkt: <a href="default.asp?id=<%=RS("AID")%>"><%=RS("product")%></a> (<%=RS("summa")%>)<br>
					<% End if
				RS.Close
				Conn.Close
				
				Set Conn = Server.CreateObject("ADODB.Connection")
				Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _
	& Server.MapPath("\webshop\") & "\databejs.mdb"
				Set RS = Server.CreateObject("ADODB.Recordset")

Är det fel att använda flera anslutningar där?

För nu när jag tänker efter, om jag "Missar" att stänga en anslutning någonstans, då förblir den ju öppen...

Hur ska jag göra detta? För jag har nog flera anslutningar lite överallt då *skäms över kodningen*

Medlem sedan jan. 20022 440 inlägg
#14

Du kan inte användra två anslutningar. Det du har gjort fel är att använt den andra anslutningen tidigare och glömt stänga den. När du då försöker ansluta igen så säger JET ifrån helt enkelt.

Din databas anslutning ska du inkludera överst på alla dina .asp sidor. skapa en fil som heter config.asp och i den filen har du bara detta:

<%@ LANGUAGE=VBSCRIPT %>
<% OPTION EXPLICIT %>

<% Response.Buffer = True

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _
  & Server.MapPath("\webshop\") & "\databejs.mdb"

%>

Nu kommer du åt Conn från alla sidor där du inkluderar config.asp. Bästa sättet i mina ögon att inkludera filer är server side include virtual. Då kan man utgå från servers root-mapp. Det blir då enklare att strukturera upp sin sida och man slipper ha en gigantisk mapp med ett par stora filer utan kan istället dela upp koden på mindre filer i några väl utvalda mappar!

<!--#include virtual="/include/config.asp"-->
<!--#include virtual="/layout/header.asp"-->

Så kodar jag men alla får göra som dom vill :)

Medlem sedan aug. 20051 200 inlägg
#15

Så då är det alltså bara att använda den där koden, i en include fil, och därefter ta bort alla saker som "gör" en anslutning till databasen i övriga dokument
(T.ex Set Conn & Conn.open) ?

Medlem sedan aug. 20051 200 inlägg
#16

Detta är en fil jag har nu (functions.inc) som jag inkluderar i alla saker.

	<% Function xxx(id, level) 
			Set C = Server.CreateObject("ADODB.Connection")
			'C.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("databejs.mdb") 
			C.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _
	& Server.MapPath("\webshop\") & "\databejs.mdb"
			Set R = Server.CreateObject("ADODB.Recordset")
			SQL = "SELECT * FROM categories WHERE PID = " & id - 0
			R.Open SQL, C, 1, 3				
				If NOT R.EOF Then
					strIDs = ""
					Do Until R.EOF
						a = 0
						Do Until a = level
							Response.Write "&nbsp;&nbsp;"
							a = a + 1							
						Loop %>
							<option value="<%=R("ID")%>">
						<% a = 0
							Do Until a = level
								Response.Write "&nbsp;&nbsp;"
								a = a + 1							
							Loop
								Response.Write R("category") %>
						</option>
									
						<% Call xxx(R("ID"), level + 1)
					R.MoveNext
					Loop
				End if				
			R.Close
			C.Close
		End Function %>
		
<% ' // Function to get all the levels of the menu	
	Function GetMenu(id, level) 
		Set C = Server.CreateObject("ADODB.Connection")
		C.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _
	& Server.MapPath("\webshop\") & "\databejs.mdb"
		Set R = Server.CreateObject("ADODB.Recordset")
		SQL = "SELECT ID, PID, category FROM categories WHERE PID = " & strip(id)
		R.Open SQL, C, 1, 3				
			If NOT R.EOF Then
				Do Until R.EOF
					a = 0
					Do Until a = level
						intPadding = (level * 10)
						If intPadding = "" Then intPadding = 0
						a = a + 1							
					Loop %>
						<div style="padding-left: <%=intPadding%>px; clear: left;">
							<a href="?cid=<%=R("ID")%>"><%=R("category")%></a>
						</div>					
					<% Call GetMenu(R("ID"), level + 1)
				R.MoveNext
				Loop
			End if				
		R.Close
		C.Close
		Set SQL = Nothing
		Set R = Nothing
		Set C = Nothing
		Set level = Nothing
	End Function
	
	' *** Function to write out layer headers
	' >> Usage: Call header(intWidth, strContent)
	' >> intWidth = Width in pixels (eg. 50)
	' >> strContent =  Text content of header (eg. "Member profile" or variable)
	
	Function header(intWidth, strContent)
		Response.Write "<div class='menu_header' style='width: " & intWidth & "px'>" & "<div class='header_content'>" & strContent & "</div>" & "</div>"
	End Function
				
	'// Function to strip out characters that could be used in a SQL injection
	Function strip(input)
		retVal = replace(input, "'", "")
		retVal = replace(retVal, "--", "")
		retVal = replace(retVal, "../", "")
		retVal = replace(retVal, ";", "")
		retVal = Server.HTMLEncode(retVal)
		strip = retVal
	End Function %>
	
	<% Sub LinkTree(intParent,intIndent)
		For X = 0 To Ubound(arrLinks,2)		
			If arrLinks(1,X) = intParent AND (Cstr(arrLinks(1,X))=Cstr(0) OR instr("," & strParentID & ",","," & intParent & ",") > 0) Then
				strPid = ""
				For Z = 1 To intIndent %>
					&nbsp; &nbsp;
				<% Next			
				strBullet = " "			
				If intIndent = 0 Then
					Sublink = arrLinks(0,X)							
				Else
					For Z = 1 To intIndent
						strPid = strPid & split(strParentID,",")(Z-1) & ","
					Next				
					Sublink = strPid & arrLinks(0,X)				
				End if %>		
				<a href="default.asp?cid=<%=arrLinks(0,X)%>&amp;pid=<%=Sublink%>"><%=strBullet & arrLinks(2,X)%></a><br>
				<% Call LinkTree(arrLinks(0,X),intIndent + 1)
			End If
		Next 
	End Sub

	Function GetRows(ByVal SQL)
		Set Connection = Server.CreateObject("ADODB.Connection")
		Connection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _
	& Server.MapPath("\webshop\") & "\databejs.mdb"		
		Set RS = Connection.Execute(SQL)
			If Not RS.BOF Or Not RS.EOF Then
				arrRecords = RS.GetRows()
			Else
				arrRecords = ""
			End If		
			RS.Close
		Set RS = nothing
		Connection.Close
		Set Connection = Nothing
		GetRows = arrRecords
	End Function %>

<%
'// Kontrollerar om bild finns.
Function GetImg(str)

  '// mappen som bilderna ligger.
  strCat = "products/"
	
  '// skapar bildnamn och lägger till ändelsen .jpg
  strFile = str &".jpg"

  '// bygger ihop mappen och filnamnet för kontroll.
  strPath = strCat &""& strFile 
	
  '// Skapar objektet
  Set file = Server.CreateObject("Scripting.FileSystemObject") 

  '// Kontrollera om filen finns
  If file.FileExists(Server.MapPath(strPath)) Then
    '// om bilden finns.
      GetImg = "<img src='"& strPath &"' alt='"& strFile &"' / border='0' widht='50' height='37'> "	  
  Else
    '// om bilden saknas.
      GetImg = "<img src='pics/nopic.gif' border='0'>"
  End if
End Function
%>
<%
'// Kontrollerar om bild finns.
Function GetImg2(str)

  '// mappen som bilderna ligger.
  strCat = "products/"
	
  '// skapar bildnamn och lägger till ändelsen .jpg
  strFile = str &"_big.jpg"

  '// bygger ihop mappen och filnamnet för kontroll.
  strPath = strCat &""& strFile
	
  '// Skapar objektet
  Set file = Server.CreateObject("Scripting.FileSystemObject") 

  '// Kontrollera om filen finns
  If file.FileExists(Server.MapPath(strPath)) Then
    '// om bilden finns.
      GetImg2 = strPath
  Else
    '// om bilden saknas.
      GetImg2 = "nopic.gif"
  End if
End Function
%>

I denna kod, så har jag ju då flera "anslutningar"; ska jag ta bort den nedre av dom alltså?

Medlem sedan aug. 20051 200 inlägg
#17

Kan någon kommentera denna "functions.inc" ...
Där har jag alltså flera connections, som måste tas bort.
Men dom heter dock olika (C & Connection)

Är det bara att ta bort hela dom raderna (förutom t.ex den översta),
eller vaD?

Medlem sedan juni 200032 967 inlägg
#18

Huvudsaken är att du ser till att stänga och destruera objekt du inte längre använder. Objekten skapas ju bara när du kallar på funktionerna, så se till att du stänger och sätter alla objekten till nothing när du är klara med dem.

Medlem sedan apr. 20031 660 inlägg
#19

HEJ!

En nackdel är att du får många ställen att ändra på. Dock, det är snabbt gjort med sök-ersätt. Eftersom det fungerar som @nders säger, är koden inte fel i sig.

Om du känner att du inte har kunskap att justera den till en db-koppling med mera, låt det vara. Dock, du bör (ska!) döpa om filen till .asp istället.
Prova skriva in adressen till sidan i webbläsaren, och se vad som händer...
Facit: Alla kan läsa lösenord etc, inte bra!

294 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
147 ms — deklarationer (db)
0 ms — hämta statistik (cache)
144 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)