webForumDet fria alternativet

Inkludera databaskopplings-fil i asp

15 svar · 739 visningar · startad av ptr_lks

ptr_lksMedlem sedan juni 2005584 inlägg
#1

Hej wf,

jag har hittat en "sak" på nätet:
Det rekomenderades att inkludera en databaskopplingsfil.

Function dbOpen(Connect)
Set Connect = server.createobject("ADODB.Connection")
     Connect.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" &  server.mappath ("databas.mdb ") 
Set Connect = Connect
End Function

Function dbClose(Connect)
Connect.Close
Set Connect = Nothing
End Function

När man senare ska anropa dessa funktioner så skriver man bara...

Call dbOpen(Connect) 'Öppnar databasen
' Här skriver du all annan kod 
Call dbClose(Connect) 'Stänger databasen

Vad tycker ni? bra lösning eller inte?

TravoniMedlem sedan okt. 20041 556 inlägg
#2

Det är så du skall göra.
Då kan du återanvända din databaskoppling på alla sidor.

ptr_lksMedlem sedan juni 2005584 inlägg
#3

Travoni skrev:

Det är så du skall göra.
Då kan du återanvända din databaskoppling på alla sidor.

Så det skall se ut ngt liknande:
dbkoppling.asp

<%
Function dbOpen(Connect)
	Set minCon = Server.CreateObject( "Adodb.Connection" )
		minCon.Provider = "Microsoft.Jet.OLEDB.4.0"
		MdbFilePath = Server.MapPath("*")
		minCon.ConnectionString = "Data Source='" & MdbFilePath & "'"
		minCon.open
	End Function

		Function dbClose(Connect)
			minCon.Close
			Set minCon = Nothing
		End Function

%>

test.asp

<!--#include file="dbkoppling.asp" -->

<%
Call dbOpen(Connect)
	strUser = replace(Request("chattnamn"), "'", "''")
	strPasw = replace(Request("txtPassword"), "'", "''")
strSQL = "SELECT * FROM chattare WHERE Chattnamn = '"_
  & strUser & "' AND Chattpassw ='" & strPasw & "';"
Set rs = minCon.execute (strSQL) 

	if not rs.EOF then
    	strSQL = "UPDATE chattare SET OnLine = 1 WHERE chattnamn ='" & strUser & "';"
    	minCon.execute strSQL,,128
			strSQL = "INSERT INTO skickade (from, skrivet, tidpkt) VALUES ("_
    				& "'System', '<i>" & strUser & "</i> Steg in i chatten', '" & Now & "');"
    		minCon.execute strSQL,,128

Session("Inloggad") = chattare("anvID")
	Call dbClose(Connect)
    		Response.Redirect "chatt.asp"
  	else
   
			Call dbClose(Connect)
    				Response.Redirect("error.html")
  		end if
  end if
%>
@ndersMedlem sedan juni 200032 969 inlägg
#4

Vad är connect, som du skickar in i funktionerna, men aldrig använder?

Indenteringen säger jag ingenting om denna gång, men jag gråter. :'(

ptr_lksMedlem sedan juni 2005584 inlägg
#5

@nders skrev:

Vad är connect, som du skickar in i funktionerna, men aldrig använder?

Vet inte.. hittade ett exempel, som jag tyckte blev godkännt av Travoni
Hur skulle det stå istället?

Indenteringen säger jag ingenting om denna gång, men jag gråter. :'(

Men snälla @nders, jag gör mitt bästa.. hur skulle du ha indenterat?

@ndersMedlem sedan juni 200032 969 inlägg
#6

Hur skulle det stå istället?

Eftersom det inte används, så är det bara att ta bort ur koden. Både i funktionsdefinitionen och när du kallar på funktionen.

- - - - - - - -

Indenterat:

<%
Function dbOpen(Connect)
	Set minCon = Server.CreateObject( "Adodb.Connection" )
	minCon.Provider = "Microsoft.Jet.OLEDB.4.0"
	MdbFilePath = Server.MapPath("*")
	minCon.ConnectionString = "Data Source='" & MdbFilePath & "'"
	minCon.open
End Function

Function dbClose(Connect)
	minCon.Close
	Set minCon = Nothing
End Function

%>

. . . . . . . . . 

<!--#include file="dbkoppling.asp" -->

<%
Call dbOpen(Connect)
strUser = replace(Request("chattnamn"), "'", "''")	strPasw = replace(Request("txtPassword"), "'", "''")
strSQL = "SELECT * FROM chattare WHERE Chattnamn = '"_
	& strUser & "' AND Chattpassw ='" & strPasw & "';"
Set rs = minCon.execute (strSQL) 

if not rs.EOF then
	strSQL = "UPDATE chattare SET OnLine = 1 WHERE chattnamn ='" & strUser & "';"
	minCon.execute strSQL,,128
	strSQL = "INSERT INTO skickade (from, skrivet, tidpkt) VALUES ("_
    		& "'System', '<i>" & strUser & "</i> Steg in i chatten', '" & Now & "');"
    	minCon.execute strSQL,,128
	Session("Inloggad") = chattare("anvID")
	Call dbClose(Connect)
    	Response.Redirect "chatt.asp"
else
	Call dbClose(Connect)
	Response.Redirect("error.html")
end if
[b]end if[/b]
%>

När man indenterat ordentligt ser man att något är konstigt, det ligger ett end if och släpar, som inte har någon if ovanför.

I övrigt:
Funktioner skall returnera något, ett värde eller ett objekt till exempel. Returnerar man ingenting bör man använda subrutiner istället. Jag hade då låtit dessa se ut typ så här:

Sub dbOpen()
	Set minCon = Server.CreateObject( "Adodb.Connection" )
	minCon.Provider = "Microsoft.Jet.OLEDB.4.0"
	MdbFilePath = Server.MapPath("*")
	minCon.ConnectionString = "Data Source='" & MdbFilePath & "'"
	minCon.open
End Sub

Sub dbClose()
	minCon.Close
	Set minCon = Nothing
End Sub

Glöm inte bort att dim:a minCon utanför subrutinen dbOpen(), så den är global, och inte endast fungerar inuti dbOpen().

Slutligen: from ä ett reserverat ord i SQL. Du kommer att få ett felmeddelande om du ställer SQL-frågor där from används som fältnamn.

ptr_lksMedlem sedan juni 2005584 inlägg
#7

@nders skrev:

När man indenterat ordentligt

som sagt så har jag jävligt svårt för detta...

@nders skrev:

Glöm inte bort att dim:a minCon utanför subrutinen dbOpen(), så den är global, och inte endast fungerar inuti dbOpen().

Menart du så här

<%
dim minCon
Sub dbOpen()
	Set minCon = Server.CreateObject( "Adodb.Connection" )
	minCon.Provider = "Microsoft.Jet.OLEDB.4.0"
	MdbFilePath = Server.MapPath("*")
	minCon.ConnectionString = "Data Source='" & MdbFilePath & "'"
	minCon.open
End Sub

Sub dbClose()
	minCon.Close
	Set minCon = Nothing
End Sub
%>
@ndersMedlem sedan juni 200032 969 inlägg
#8

Menart du så här

Jag hade nog lagt den raden överst i filen dbkoppling.asp istället.

EDIT: Efter din redigering alltså; Ja.

- - - - -

Over and out.

emissionMedlem sedan dec. 19996 721 inlägg
#9

ptr_lks skrev:

som sagt så har jag jävligt svårt för detta...

Principen med indentering är att man avgränsar logiska block genom att justera dem dem horisontellt. Ett logiskt block är en programsats som har en definierad början och ett definierat slut.

Ex:


If userName="kalle" Then ' [B]Här börjar en if-sats. Nästa rad ska skjutas in[/B]
   Response.Write "Hej Kalle! "
   If startDate>Now() Then '[B]Här börjar en till if-sats. Nästa rad ska skjutas in[/B]
      Response.Write "Du får inte vara med ännu.."
   Else '[B]Blocket är slut, så vi hoppar tillbaka igen, men eftersom det är en Else så blir nästa rad inskjuten[/B]
      Response.Write "Du får vara med nu.."
   End If '[B]Blocket är slut[/B]
   Response.Write "<br>"
End If

Sub dbOpen '[B]Subben börjar[/B]
   Set minCon = Server.CreateObject( "Adodb.Connection" )
   minCon.Provider = "Microsoft.Jet.OLEDB.4.0"
   MdbFilePath = Server.MapPath("*")
   minCon.ConnectionString = "Data Source='" & MdbFilePath & "'"
   minCon.open
End Sub '[B]Subben slutar[/B]

Do Until objRS.EOF '[B]Do Until-loopen börjar[/B]
   Response.Write objRS("Kaka")
   For i=1 to 5 '[B]For-loopen börjar[/B]
      Response.Write "Kaka"
   Next '[B]For-loopen slutar[/B]
   objRS.Movenext
Loop '[B]Do Until-loopen slutar[/B]
doggelitoMedlem sedan juni 20003 076 inlägg
#10

Ursäkta om jag kommer in och stör orginaltråden, hoppas det är ok. :)
Nu, när vi är inne på indentering, finns det nån regel om radbryt i koden? Alltså för att få koden mer lättläst.
Jag hade vilja skriva detta stycke på detta viset, rätt? fel?

Do Until objRS.EOF 'Do Until-loopen börjar
   Response.Write objRS("Kaka")

   For i=1 to 5 'For-loopen börjar
      Response.Write "Kaka"
   Next 'For-loopen slutar

   objRS.Movenext
Loop 'Do Until-loopen slutar
emissionMedlem sedan dec. 19996 721 inlägg
#11

doggelito skrev:

Jag hade vilja skriva detta stycke på detta viset, rätt? fel?

Indentering handlar om att göra koden lättläst och strukturerad, så om radbrytningar gör koden mer lättläst så är det utan tvekan rätt. Det finns inga regler att följa, utom möjligtvis sådana man har enats om med sina medutvecklare. Här på forumet är det dock en "god regel" att använda sig av indentering, eftersom det gör det så mycket lättare att förstå okänd kod.

Vill man träna så kan man ju alltid prova att programmera i Python, där indenteringen är helt avgörande för programmens funktion ;)

ptr_lksMedlem sedan juni 2005584 inlägg
#12

är ju noob på detta med includes..

Hej wf,
är det rätt srivet om jag gör på detta sättet?

<!-- #include virtual="/includes/dbkoppling.asp" -->
<!-- #include virtual="/includes/koll_inloggningen.asp"  -->
<%
 Call PageAccess() 
strMessage = Server.HTMLEncode(Trim(Replace(Request("txtChatt"), "'", "''")))

Call dbOpen()
    strSQL = "INSERT INTO skickade (avUser, mess, tidpkt) VALUES ('"_
      & Session("Inloggad") & "', '" & strMessage & "', '" & Now & "');"
    minCon.Execute strSQL 
     
Call dbClose()

%>
<html>

<head>
<title>Chatta</title>
<script language="JavaScript">
<!--
  window.parent.frm_messages.location.href += '';
//-->
</script>
</head>

<body bgcolor="#FFFFFF">

</body>

</html>
TravoniMedlem sedan okt. 20041 556 inlägg
#13

Använd gärna file istället för virtual om du kan...
Lägg till ,,128 (Betyder att sql:en inte skall returnera något)
minCon.Execute strSQL , , 128
Används på Update, insert och delete. Ej på select!
Annars så ser det bra ut.

doggelitoMedlem sedan juni 20003 076 inlägg
#14

Travoni skrev:

Använd gärna file istället för virtual om du kan...

Varför då?

emissionMedlem sedan dec. 19996 721 inlägg
#15

Inte för att det spelar så stor roll här, men en bra generell praxis är att inte HTML-encoda det som du stoppar in i databasen. Det ska man göra när man visar det man hämtat från databasen.

GlitterMedlem sedan juli 2003465 inlägg
#16

ptr_lks skrev:

Hej wf,
är det rätt srivet om jag gör på detta sättet?

...
<html>

<head>
<title>Chatta</title>
<script language="JavaScript">
<!--
  window.parent.frm_messages.location.href += '';
//-->
</script>
</head>

<body bgcolor="#FFFFFF">

</body>

</html>

Jo förutom Html koden som man också bör Indentera så man har lite koll på taggarna...
typ så här

...
<html>
	<head>
		<title>Chatta</title>
		<script language="JavaScript">
		<!--
			window.parent.frm_messages.location.href += '';
		//-->
		</script>
	</head>
	<body bgcolor="#FFFFFF">

	</body>
</html>
143 ms totalt · 3 externa anrop · v20260731065814-full.beb2e261
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
140 ms — hämta tråd, inlägg och bilagor (db)