Fehler bei Einfügen von neuem Datensatz

schutzgeist

Erfahrenes Mitglied
Nachdem ich mich nun gut über eine Woche durch "ASP für Dummies" gelesen hab wollt ich nun mal mein erster, eigenes kleines 'Projekt' ausprobieren - ganz ohne DW ;)

Das Anzeigen der Einträge hat nach kurzem (oder auch längerem ^^) Probieren/Problemen dann endlich einwandfrei geklappt.
Aber nun bekomm ichs absolut nicht fertig einen neuen Eintrag hinzuzufügen :(

Hier mal mein Code:
Code:
<% Option Explicit %>
<!-- #include file="adovbs.inc" -->
<html>
<head>
<title>Gästebuch</title>
</head>

<body>
<b>Eintrage:</b><p>
<% 
If Request("Name") = "" And Request("eMail") = "" And Request("Message") = "" Then
%>
Bitte alle Pflichtfelder ausfüllen.
<p> 
<form action="gb.asp" method="post" name="add" id="add">
  <table width="40%" border="0" cellspacing="1" cellpadding="1">
    <tr> 
      <td>Name:</td>
      <td><input name="Name" type="text" id="Name"></td>
    </tr>
    <tr> 
      <td>eMail:</td>
      <td><input name="eMail" type="text" id="eMail"></td>
    </tr>
    <tr> 
      <td>URL:</td>
      <td><input name="URL" type="text" id="URL"></td>
    </tr>
    <tr> 
      <td>Message:</td>
      <td><textarea name="Message" id="Message"></textarea></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><input type="submit" name="Submit" value="Eintragen"></td>
    </tr>
  </table>
</form>
<% Else %>
<%
Dim Connect, NewPost
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "gbook"
Set NewPost = Server.CreateObject("ADODB.Recordset")
NewPost.Open "SELECT * FROM gb"
	Connect.adOpenDynamic,adLockOptimistic
NewPost.AddNew
NewPost("Name") = Request("Name")
NewPost("eMail") = Request("eMail")
NewPost("URL") = Request("URL")
NewPost("Message") = Request("Message")
NewPost("Datum_Zeit") = Date
NewPost.Update 
%>
<% End if %>

<p> 
<p>
<b>Einträge:</b><p>
<%
Dim Connect2, GB
Set Connect2 = Server.CreateObject("ADODB.Connection")
Connect2.Open "gbook"
Set GB = Connect2.Execute("SELECT * FROM gb ORDER BY Datum_Zeit DESC")
Do Until GB.EOF %>
<table width="40%" border="0" cellspacing="1" cellpadding="1">
  <tr> 
    <td> 
      <a href="mailto:<% = GB("eMail") %>"><% = GB("Name") %></a>
      schrieb am 
      <% = GB("Datum_Zeit") %>
      :</td>
    <td><a href="<% = GB("URL") %>" target="_blank">URL</a><br></td>
  </tr>
  <tr> 
    <td> 
      <% = GB("Message") %>
    </td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td><% = GB("Kommentar") %></td>
    <td>&nbsp;</td>
  </tr>
</table>
<p> 
  <% GB.MoveNext
Loop %>
</body>
</html>

Sobald ich einen Eintrag machen will, bekomm ich folgende Fehlermeldung:

Fehlertyp:
ADODB.Recordset (0x800A0E7D)
The connection cannot be used to perform this operation. It is either closed or invalid in this context.
/dummies/myGB/gb.asp, line 45

Line 45 (rot markiert):

Dim Connect, NewPost
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "gbook"
Set NewPost = Server.CreateObject("ADODB.Recordset")
NewPost.Open "SELECT * FROM gb"
Connect.adOpenDynamic,adLockOptimistic
NewPost.AddNew
NewPost("Name") = Request("Name")
NewPost("eMail") = Request("eMail")
NewPost("URL") = Request("URL")
NewPost("Message") = Request("Message")
NewPost("Datum_Zeit") = Date
NewPost.Update

So, was hab ich denn da nun wieder verbockt? :D
 
L

Lord-Lance

Ich kenne die Art nicht wirklich wie du das machen willst, aber meiner Meinung nach solltest du mit INSERT INTO arbeiten und nicht mit SELECT * FROM.
 

Luzie

Erfahrenes Mitglied
Hi

versuchs mal so.
Wenn Du einen DS per ADO einfügst, sollstest Du immer eine Bedingung mitgeben, die nie erfüllt werden kann (where 1<0)

dim sql
sql="SELECT * FROM gb where 1<0"
NewPost.Open sql,Connect,adOpenStatic,adLockOptimistic
 

schutzgeist

Erfahrenes Mitglied
Danke, es klappt :)
Hab noch festgestellt, dass ich die and's in der If... Else... Schleife gehen or austauschen musste :)

Gibts für die mitgegebene Bedingung irgend eine plausible Erklärung?
Funktionieren tuts jetzt ja, aber schlauer bin ich deswegen noch nicht ;)
 

Luzie

Erfahrenes Mitglied
Hi

es lag aber jetzt nicht an der Bedingung, es hätte auch ohne funktionieren können. Es ist nur besser, wenn man die Bedingung setzt, denn nur so stellt damit sicher, das absolut kein Datensatz zurückgegeben werden kann, denn 1< 0 gibts nie. Du willst ja einen Datensatz einfügen und nicht selectieren.

Dein Fehler lag aber woanders

Du hattest zwischen Connect und der 1. Konstanten einen Punkt. Dort gehört aber ein Komma hin. Und ob da jetzt ein Zeilenumbruch war, kann ich nicht feststellen. Es gehört aber eigentlich in eine Zeile von Open angefangen bis zum Aufruf der letzten Konstanten.
;)
 
Zuletzt bearbeitet:

schutzgeist

Erfahrenes Mitglied
oller Punkt :suspekt:
So viel Wirbel wegen so nem kleinen Ding :(

Entweder wars (mal wieder) ein Tippfehler im Buch oder ich hab mich tatsächlich vertippt...

Das wird mir denk ich jetzt kein zweites Mal mehr passieren :D

Naja, immerhin, es wird :p :)

Danke nochmal :)
 

Luzie

Erfahrenes Mitglied
Huhu

also Tippfehler in Büchern, die für Anfänger geschrieben sind, sind wirklich schlimm. :( :mad:

Ich habe vor Jahren auch mal an mir selbst gezweifelt, bis ich feststellen musste, dass es nicht an mir lag sondern an einem Tippfehler im Scriptcode eines Buches.

Gut sind Bücher mit praktischen Beispielen auf einer mitgelieferten CD. Da kann man davon ausgehen, dass sie durchgetestet sind und funktionieren.
 

schutzgeist

Erfahrenes Mitglied
Wie müsste ich das Script eigentlich umschreiben, falls ich INSERT INTO verwenden wollte?
In meinen Büchern steht nur dass ich es anstatt addNew nehmen kann, aber es wird nicht erklärt wie :-( ('tolle' Bücher :eek: )
Hier und google bin ich auch schon durch, hab aber nichts gefunden, was ich annährend verstanden hätte...:(
 

Luzie

Erfahrenes Mitglied
Hi

mit Sicherheit ist es wichtig zu wissen, wie man einen Datensatz auch per insert into einfügt. Auch SQL update und delete sind wichtig.

Man kann teilweise mit der SQL-Methode mehr machen, z.B. kannst Du Dir per insert into direkt einen bestimmten Datensatz aus einer Tabelle selectieren und in eine andere einfügen. Ganz gut nachlesen kannst Du es hier:
http://www.asphelper.de/ASPKurs/A400101.asp, aber nur die Grundlagen, reicht aber in den meisten Fällen.

Im Allgemeinen heißt es, dass die ADO-Methode performanter ist. Ich wiess es nicht. Ich nutze meistens die ADO-Methode, denn hier hast Du auch die Möglichkeit, Dir direkt die ID des neu eingefügten Datensatzes anzeigen zu lassen um ggfs. den Datensatz direkt weiterzuverarbeiten bzw. auf dem Bildschirm auszugeben.
 

schutzgeist

Erfahrenes Mitglied
Update hab ich hinbekommen.. aber an Delete beiß ich mir seit 2 Tagen die Zähne aus :(

Hab ne Übersicht erstellt und die ganzen Einträge in ner Do Until.. Loop.. Schleife auflisten lassen...
Davon hat nun jeder Eintrag nen Del-Button.. Nur bin ich mir momentan total unsicher, ob name=ID im Input Tag überhaupt da hin muss...
und wenn ich dann nen Eintrag löschen will kommt ein Fehler, bzw. die Seite wird von Vornherein nicht angezeigt... :(

Code:
<% Sub ShowPosts(ID_GB,Name,eMail,URL,Message,Datum_Zeit,Kommentar) %>
<table width="600px" border="1" cellspacing="1" cellpadding="1">
  <tr valign="top"> 
    <td>ID</td>
    <td>Datum</td>
    <td>Name</td>
    <td>Message</td>
    <td colspan="2"><center>Aktion</center></td>
  </tr>
  <% Do Until GB.EOF %>
  <tr valign="top"> 
    <td><%=ID_GB%></td>
    <td><%=Datum_Zeit%></td>
    <td><%=Name%></td>
    <td><%= Left (Message,25)%></td>
    <td>read/edit</td>
    <td> <form method="post" action="over.asp" name="del">
        <input type="submit" value="DEL" name="<%=ID_GB%>">
      </form></td>
  </tr>
  <% GB.MoveNext
Loop %>
</table>
<% End Sub %>
<%
Dim GB, SQL, Connect2
Set Connect2 = Server.CreateObject("ADODB.Connection")
Connect2.Open "gbook"
Set GB = Server.CreateObject("ADODB.Recordset")
SQL = "SELECT * FROM gb ORDER BY ID_GB DESC"
GB.Open SQL, Connect2
ShowPosts GB("ID_GB"), GB("Name"), GB("eMail"), GB("URL"), GB("Message"), GB("Datum_Zeit"), GB("Kommentar")
%>
<% 
Dim SQL2, Connect, GBdel
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "gbook"
Set GBdel = Server.CreateObject("ADODB.Recordset")
SQL2 = "DELETE FROM gb WHERE ID_GB" = Request.Form("DEL")
GBdel.Open SQL2, Connect, adOpenDynamic, adLockOptimistic
%>

Da meckert er:
Fehlertyp:
ADODB.Recordset (0x800A0BB9)
Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.
/dummies/myGB/over.asp, line 45

-> GBdel.Open SQL2, Connect, adOpenDynamic, adLockOptimistic