webForumDet fria alternativet

...already an open DataReader associated with this Connection which must be closed...

.NET

3 svar · 323 visningar · startad av greggan

Medlem sedan jan. 2004678 inlägg
Frågan#1
<%@ Page Language="VB" debug="true" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.Oledb" %>
<script runat="server">
sub skapa_click(obj as object, e as eventargs)
Dim cn as new OleDbConnection("PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=C:\Inetpub\databaser\onska.mdb;")
Dim cmd as new OleDbCommand("select * from anv WHERE nick='" + nick.Text + "'" ,cn)
Dim dr as OledbDataReader
cn.Open()
dr = cmd.ExecuteReader()
if (dr.read()) Then
label1.text = "Användarnamnet du valde finns redan."
dr.close()
else
Dim cmd2 as new OleDbCommand("INSERT INTO anv(nick,pass) VALUES('" & nick.Text & "','" & pass.Text & "') ",cn)
Cmd2.ExecuteNonQuery()
cn.Close
end if
end sub
</script>
<html>
<head>
<title>Registrera</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<form runat="server">
Användarnamn<br/>
<asp:textbox id="nick" runat="server"/><br/>
Lösenord<br/>
<asp:textbox id="pass" runat="server"/><br/>
Ange Lösenordet igen<br/>
<asp:textbox id="passagain" runat="server"/><br/>
<asp:button id="skapa" OnClick="skapa_click" Text="Registrera" runat="server"/><br/>
<asp:label id="label1" runat="server"/>

</form>

</body>
</html>

Jag försöker lägga in användarnamn och lösenord i databasen. Först vill jag dock kolla upp så att inte samma användarnamn redan finns.

Jag kollar då först upp om användaren finns med hjälp av read().
Om användaren inte finns ska värdena läggas till, men då får jag ett felmeddelande som säger att det redan är en datareader öppen till den här databasanslutningen. Men jag har ju lagt till kommandot dr.close() vilket ska se till att datareadern stängs.... eller?

någon som kan se vad som är fel? :q

(jag vet att jag måste kolla upp att man skriver samma lösenord också, jag ska fixa det senare med valdation)

Medlem sedan sep. 20011 914 inlägg
#2
Dim dr as OledbDataReader
try
   cn.Open()
   dr = cmd.ExecuteReader()
   if(dr.HasRows) then
      dr.close()
      label1.text = "Användarnamnet du valde finns redan."   
   else
      dr.close()
      Dim cmd2 as new OleDbCommand("INSERT INTO anv(nick,pass) VALUES('" & nick.Text & "','" & pass.Text & "') ",cn)
      Cmd2.ExecuteNonQuery()
   end if
catch
   'throw
finally
   cn.Close()
end try
Medlem sedan jan. 2004678 inlägg
#3

Tackar så mycket, jag har aldrig lärt mig "try". Fattar dock inte varför det inte fungerade på mitt sätt. :/

Medlem sedan sep. 20011 914 inlägg
#4

Ditt sätt fungerar inte pga din if sats. Om din if-sats är true(datareadern har data) så stänger du datareadern, men om den inte har data så stänger du den inte i else satsen. Samma sak med ditt connection obekt. Det stängs bara när if-satsen är false(datareadern har inte data).

if (dr.read()) Then
   label1.text = "Användarnamnet du valde finns redan."
   [b]'dr stängs, men inte cn[/b]
   dr.close()
else
   Dim cmd2 as new OleDbCommand("INSERT INTO anv(nick,pass) VALUES('" & nick.Text & "','" & pass.Text & "') ",cn)
   Cmd2.ExecuteNonQuery()
   [b]'cn stängs, men inte dr[/b]
   cn.Close
end if
264 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
132 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
133 ms — ändringar (db)