03. august 2004 - 01:13Der er
29 kommentarer og 1 løsning
Datareader ikke åben
Jeg har et lille problem. Jeg har skrevet noget kode som fungerer udmærket. Men nu vil jeg gerne udbygge koden lidt. Jeg har lavet en "Rediger bruger" side. Og nu vil jeg gerne lige smide lidt kode ind der tjekker om, at hvis brugeren vil ændre sit brugernavn, det allerede eksisterer.
Dette ville jer gøre som en function, men den siger bare at Datareaderen ikke er åben.
-------------------------------- Public sub click_gem(Source as Object, E as EventArgs)
try
Dim bid as string = session("brugerid")
Dim tjek as string
Select case Session("brugertype")
Case = "admin" tjek = 1 Case = "bruger" tjek = 2 end select
catch ex as exception response.write(ex.tostring()) end try
try DataOleDB.OpenDb("Tomo") Dim bid as string = session("brugerid") DataOleDB.DanData("SELECT * FROM Brugere WHERE BrugerID=" & bid & ";") If DataOleDB.Data.Read() Session("login") = "inde" Session("brugernavn") = DataOleDB.SletBlank(DataOleDB.Data("Brugernavn").ToString) Session("brugerid") = DataOleDB.SletBlank(DataOleDB.Data("BrugerID").ToString) Session("brugertypeid") = DataOleDB.SletBlank(DataOleDB.Data("BrugertypeID").ToString) Session("brugertype") = HentBrugertype(DataOleDB.SletBlank(DataOleDB.Data("BrugertypeID").ToString)) End If DataOleDB.CloseDb() catch ex as exception response.write(ex.tostring()) end try
response.redirect(request.rawurl)
end sub --------------------------------
Denne kode fungerer udmærket. Men jeg vil tilføje den kode der tjekker brugernavnet FØR dataen bliver smidt i databasen, men så sker der en fejl. Dette er den kode:
-------------------------------- try DataOleDB.OpenDb("Tomo") DataOleDB.DanData("SELECT Brugernavn FROM Brugere WHERE Brugernavn =" & txtRedigerbrugernavn.text & ";")
If DataOleDB.Data.Read() label.text = "eksisterer" else label.text = "eksisterer ikke" End If
DataOleDB.CloseDb() catch ex as exception response.write(ex.tostring()) end try -----------------------------------
Den moderne arbejdsplads er i stigende grad afhængig af mødelokaler til at fremme samarbejde, men dette skift medfører også stigende sikkerhedsudfordringer.
hvis du prøver at læse fra en database - uden en åben forbindelse - vil du få fejlen. Det er derfor klart at der ikke kommer nogen fejl, når du ikke prøver at læse. men.... der er stadig ikke noget i det kode du har vist der åbner en forbindelse (eller læser for den sags skyld). du bliver nødt til at poste koden til den klasse som DataOleDb er en instans af.
du har lagt det ud før, men smid det lige her igen i den nuværende form.... ellers kan vi ikke hjælpe :o) (det er bare kald til ukendte metoder du viser :o)
public function OpenDB(databasenavn as string) as oledbconnection HttpContext.Current.Trace.Write("OpenDB","Calling OpenDB")
Try 'DBSti = ConfigurationSettings.AppSettings("databaseoledb") & databasenavn & ".mdb" DBSti = HttpContext.Current.Request.PhysicalApplicationPath & "\db\" & databasenavn & ".mdb" strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" strConn += "Data Source=" & DBSti ObjConn = new OledbConnection(strConn) objConn.Open() Catch ex as exception HttpContext.Current.Response.Write(ex.tostring()) end try end function
public function DanData(strSQL as string) as OledbDataReader Try objCmd = new OledbCommand(strSQL,ObjConn) data = objCmd.ExecuteREader() Catch ex as exception 'response.write(ex.tostring()) end try end function
public function SkrivData(strSQL as string) as OledbDataReader Dim sSql as string = strSQL HttpContext.Current.Trace.Write("SkrivData","Calling SkrivData")
Try objCmd = new OledbCommand(strSQL,ObjConn) objCmd.ExecuteNonQuery() 'HttpContext.Current.Response.Write("hejsa") Catch ex as exception HttpContext.Current.Response.Write(ex.tostring()) end try end function
System.InvalidOperationException: Invalid attempt to Read when reader is closed. at System.Data.OleDb.OleDbDataReader.Read() at redigerbruger.Tjekbrugernavn(String Bruger) in E:\Projects\Tomo.dk\sider\redigerbruger.ascx.vb:line 167
Function Tjekbrugernavn(Bruger as string) as boolean try DataOleDB.OpenDb("Tomo") DataOleDB.DanData("SELECT Brugernavn FROM Brugere WHERE Brugernavn= " & Bruger & ";") If DataOleDB.Data.Read() Return true else Return false End If DataOleDB.CloseDb() catch ex as exception response.write(ex.tostring()) end try end function
DataOleDB.Data.Read() Den metode... det er jo sikkert i den din exception bliver smidt... kan du ikke debugge dig ind og se hvad der sker ?
Tydeligvis antages forbindelsen at være lukket, så det er den jo sikkert også, men det ville jo være nemmere hvis du bare debuggede dig ind igennem... Se hvordan sekvensen er gennem metoderne, og så konstatere hvornår og hvor fejlen bliver smidt...
Imports System Imports System.Web Imports System.Web.UI Imports System.Web.UI.WebControls Imports Database
Public Class redigerbruger : Inherits usercontrol
Protected trRedigerBrugertypeAdmin as System.Web.UI.HtmlControls.HtmlTableRow Protected trRedigerBrugertype as System.Web.UI.HtmlControls.HtmlTableRow Protected lblRedigerBrugerID as System.Web.UI.WebControls.label Protected lblfejl as System.Web.UI.WebControls.label Protected txtRedigerBrugernavn as System.Web.UI.WebControls.textbox Protected txtRedigerAdgangskode as System.Web.UI.WebControls.textbox Protected txtRedigerNavn as System.Web.UI.WebControls.textbox Protected txtRedigerEmail as System.Web.UI.WebControls.textbox Protected txtRedigerLand as System.Web.UI.WebControls.textbox Protected txtRedigerBy as System.Web.UI.WebControls.textbox Protected txtRedigerPostnummer as System.Web.UI.WebControls.textbox Protected txtRedigerHjemmeside as System.Web.UI.WebControls.textbox Protected drpRedigerBrugertype as System.Web.UI.WebControls.dropdownlist Protected lblRedigerBrugertype as System.Web.UI.WebControls.label
Dim DataOleDB as new DataBaseOleDB()
Public sub Page_Load(Source as Object, E as EventArgs)
If Session("login") = nothing then response.redirect(request.path) else If not page.ispostback try DataOleDB.opendb("Tomo") DataOleDB.DanData("SELECT * from Brugertype") Do while DataOleDb.Data.Read() drpRedigerBrugertype.items.add(New ListItem(DataOleDb.Data("Brugertype"),DataOleDb.Data("BrugertypeID"))) loop DataOleDB.closedb() catch ex as exception response.write(ex.tostring()) end try end if
try DataOleDB.OpenDb("Tomo") DataOleDB.DanData("SELECT * FROM Brugere WHERE BrugerID=" & Request.Querystring("bid") & ";") If DataOleDB.Data.Read() lblRedigerBrugerID.text = DataOleDB.SletBlank(DataOleDB.Data("BrugerID").ToString) txtRedigerBrugernavn.text = DataOleDB.SletBlank(DataOleDB.Data("Brugernavn").ToString) txtRedigerAdgangskode.text = DataOleDB.SletBlank(DataOleDB.Data("Adgangskode").ToString) txtRedigerNavn.text = DataOleDB.SletBlank(DataOleDB.Data("Navn").ToString) txtRedigerEmail.text = DataOleDB.SletBlank(DataOleDB.Data("Email").ToString) txtRedigerBy.text = DataOleDB.SletBlank(DataOleDB.Data("B").ToString) txtRedigerLand.text = DataOleDB.SletBlank(DataOleDB.Data("Land").ToString) txtRedigerPostnummer.text = DataOleDB.SletBlank(DataOleDB.Data("Postnummer").ToString) txtRedigerHjemmeside.text = DataOleDB.SletBlank(DataOleDB.Data("Hjemmeside").ToString) 'drpRedigerBrugertype.text = DataOleDB.SletBlank(DataOleDB.Data("Brugernavn").ToString) lblRedigerBrugertype.text = HentBrugertype(DataOleDB.SletBlank(DataOleDB.Data("BrugertypeID").ToString)) Else lblRedigerBrugerID.text = "Brugeren findes ikke" End If DataOleDB.CloseDb() catch ex as exception response.write(ex.tostring()) end try end if
Dim status as string = Session("brugertype")
Select case status
Case "admin" trRedigerBrugertypeAdmin.visible = true trRedigerBrugertype.visible = false Case else trRedigerBrugertypeAdmin.visible = false trRedigerBrugertype.visible = true end select
end sub
Public sub click_gem(Source as Object, E as EventArgs)
if Tjekbrugernavn(txtredigerbrugernavn.text) = true response.write("true") else response.write("false") end if
try
Dim bid as string = session("brugerid")
Dim tjek as string
Select case Session("brugertype")
Case = "admin" tjek = 1 Case = "bruger" tjek = 2 end select
catch ex as exception response.write(ex.tostring()) end try
try DataOleDB.OpenDb("Tomo") Dim bid as string = session("brugerid") DataOleDB.DanData("SELECT * FROM Brugere WHERE BrugerID=" & bid & ";") If DataOleDB.Data.Read() Session("login") = "inde" Session("brugernavn") = DataOleDB.SletBlank(DataOleDB.Data("Brugernavn").ToString) Session("brugerid") = DataOleDB.SletBlank(DataOleDB.Data("BrugerID").ToString) Session("brugertypeid") = DataOleDB.SletBlank(DataOleDB.Data("BrugertypeID").ToString) Session("brugertype") = HentBrugertype(DataOleDB.SletBlank(DataOleDB.Data("BrugertypeID").ToString)) End If DataOleDB.CloseDb() catch ex as exception response.write(ex.tostring()) end try
'response.redirect(request.rawurl)
end sub
Function HentBrugertype(ID as string) try DataOleDB.OpenDb("Tomo") DataOleDB.DanData("SELECT Brugertype FROM Brugertype WHERE BrugertypeID=" & ID & ";") If DataOleDB.Data.Read() Return DataOleDB.SletBlank(DataOleDB.Data("Brugertype").ToString) End If DataOleDB.CloseDb() catch ex as exception response.write(ex.tostring()) end try end function
Function HentBrugertypeID(B as string) try DataOleDB.OpenDb("Tomo") DataOleDB.DanData("SELECT BrugertypeID FROM Brugertype WHERE Brugertype = " & B & ";") If DataOleDB.Data.Read() Return DataOleDB.SletBlank(DataOleDB.Data("BrugertypeID").ToString) End If DataOleDB.CloseDb() catch ex as exception response.write(ex.tostring()) end try end function
Function Tjekbrugernavn(Bruger as string) as boolean try DataOleDB.OpenDb("Tomo") DataOleDB.DanData("SELECT Brugernavn FROM Brugere WHERE Brugernavn= " & Bruger & ";") If DataOleDB.Data.Read() Return true else Return false End If DataOleDB.CloseDb() catch ex as exception response.write(ex.tostring()) end try end function
hey jaffafo.... jeg ved godt hvad du udvikler i, men visual studio er bestemt ikke en forudsætning for at debugge en .net - applikation (heller ikke en webapplikation). du skal bruge det tool der hedder dbgclr.exe (det har gui, men der er også en kommandoliniemodel), og der er rigeligt med vejledning til at bruge det i docs og forskellige steder på nettet.
men du kan self. også gøre ligesom sidst... altså trace ned igennem. fejlen er jo sikkert også den samme som sidst.... altså det kikser med styrringen omkring at åbne og lukke datasen, så der er en eller anden rutine der ikke kører færdig eller lignende, eller en metode der ikke kaldes som den skal.
det er en komkomponent... der er sikkert gået noget i hegnet med registreringen af den. du kan bare fra start/kør skrive regsvr32 "c:\program files\Common files\Microsoft Shared\MSEnv" så skulle den blive registreret, og efterfølgende fungere.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.