[ASP.NET + VB.NET] OledbException invalid filename

Pagina: 1
Acties:

  • Rath
  • Registratie: April 2002
  • Laatst online: 18-02 10:59
Eerst en vooral even melden dat deze 'site' lokaal perfect werkt, enkel wanneer ik die upload naar een online webspace krijg ik de volgende foutmelding, het betreft hier identiek dezelfde code met dat detail dat alle path's aangepast zijn aan de online versie + de dll file

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.  

Stack Trace: 

[OleDbException (0x80004005): Not a valid file name.]
   System.Data.OleDb.OleDbConnection.ProcessResults(Int32 hr) +20
   System.Data.OleDb.OleDbConnection.InitializeProvider() +57
   System.Data.OleDb.OleDbConnection.Open() +203
   FamMartens.Login.FillList()
   FamMartens.Login.Page_Load(Object sender, EventArgs e)
   System.Web.UI.Control.OnLoad(EventArgs e) +67
   System.Web.UI.Control.LoadRecursive() +35
   System.Web.UI.Page.ProcessRequestMain() +725


hier volgt de code van de Login.aspx.vb file

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
Imports System.Data.OleDb
Imports System.Web.Security

Public Class Login
  Inherits System.Web.UI.Page

#Region " Web Form Designer Generated Code "

  'This call is required by the Web Form Designer.
  <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

  End Sub
  Protected WithEvents RequiredFieldValidator2 As System.Web.UI.WebControls.RequiredFieldValidator
  Protected WithEvents BtnLogin As System.Web.UI.WebControls.Button
  Protected WithEvents frmLogin As System.Web.UI.HtmlControls.HtmlForm

  'NOTE: The following placeholder declaration is required by the Web Form Designer.
  'Do not delete or move it.
  Private designerPlaceholderDeclaration As System.Object

  Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
    'CODEGEN: This method call is required by the Web Form Designer
    'Do not modify it using the code editor.
    InitializeComponent()
  End Sub
  Protected WithEvents lstNamen As System.Web.UI.WebControls.DropDownList
  Protected WithEvents UserPass As System.Web.UI.WebControls.TextBox
  Protected WithEvents Msg As System.Web.UI.WebControls.Label
  Protected WithEvents PersistCookie As System.Web.UI.WebControls.CheckBox
#End Region

  Private conStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=http://rath.europe.webmatrixhosting.net/db/testing.mdb"

  Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    If Not IsPostBack Then
      FillList()
    End If
  End Sub

  'Laad alle namen van de mensen die kunnen inloggen in de dropdownlist (is toch de bedoeling ;-) )
  Private Sub FillList()
    Dim dbCon As New OleDbConnection(conStr)
    Dim ds As DataSet = New DataSet

    dbCon.Open()
    Dim objCmd As New OleDbDataAdapter("SELECT * FROM qryUsers", dbCon)

    objCmd.Fill(ds, "qryUsers")

    lstNamen.DataSource = ds
    lstNamen.DataMember = "qryUsers"
    lstNamen.DataTextField = "UserName"
    lstNamen.DataBind()

    dbCon.Close()
  End Sub

  Public Sub Login_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BtnLogin.Click
    Dim dbCon As New OleDbConnection(conStr)
    Dim strName As String = ""

    strName = lstNamen.SelectedValue
    dbCon.Open()
    Dim objCmd As OleDbDataReader
    Dim cmd As New OleDbCommand("SELECT * FROM qryUsers WHERE UserName =' " & strName & " ' And UserPass = ' " & UserPass.Text & " ' ", dbCon)

    objCmd = cmd.ExecuteReader(CommandBehavior.SingleResult)

    If objCmd.Read Then
      FormsAuthentication.RedirectFromLoginPage(strName, PersistCookie.Checked)
      objCmd.Close()
    Else
      Msg.Text = "Ongeldig paswoord voor deze gebruiker"
      objCmd.Close()
    End If
    dbCon.Close()
  End Sub
End Class


de query bevat de velden: UserID, UserName, UserPass

ik heb dus totaal geen idee vanwaar dat die invalid file name komt mede omdat hij de db opzich al vindt, anders geeft hij die error dat de database niet op z'n plaats staat

I don't believe we have a society, we have a colony of animals


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

Visual Basic .NET:
1
Data Source=http://rath.europe.webmatrixhosting.net/db/testing.mdb

en hier gaat hij trouwens op vastlopen (scheelt weer een keer compileren.. :+)

Dit moet een pad zijn, zoals "w:\websites\mijnwebsite\data\testing.mdb"

Je mag geen url neerzetten.

En buiten dit: lees het gedeelte in de de PW-FAQ over parametrized queries of wees niet verbaasd dat een bezoeker je database leeghaalt.

Als we toch bezig zijn met opmerkingen: Waarom zet je je connectionstring niet in je web.config?

Volgende punt:
Visual Basic .NET:
1
2
3
   Dim strName As String = ""

    strName = lstNamen.SelectedValue

Is imho ook een beetje onzinnig; maak er van:

Visual Basic .NET:
1
Dim strName As String = lstNamen.SelectedValue


Verder ben ik persoonlijk niet zo een fan van nesten
Visual Basic .NET:
1
2
3
4
5
  Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    If Not IsPostBack Then
      FillList()
    End If
  End Sub

Zou ik herschrijven als:
Visual Basic .NET:
1
2
3
4
5
6
 Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    If IsPostBack Then Exit Sub

    FillList()

  End Sub


Bij regel 40 tot 51 gebruik je een dataset. Waarom? In deze constructie is het sneller om een datareader te gebruiken. Als je in een N-Tier opzet werkt, kan je datasets / datatables / collections met custom objects doorgeven.

Regel 67:
cmd.ExecuteReader; waarom deze? cmd.ExecuteScaler lijkt me ook een goed alternatief; aangezien je 1 resultvalue verwacht. In jouw methodiek kan je het zelfs afdwingen dat je altijd 1 resultwaarde krijgt door een
SQL:
1
Select count(*) as aantal  FROm tabelnaam WHERE username=@Username and Password = @Password

te gebruiken. Indien de resultwaarde 0 is, is er geen geldig wachtwoord gevonden. Indien wel, dan kan krijg je een 1 terug.

En over je wachtwoorden: Kijk eens in de formsauthentication class; daar zit ook een method bij om je wachtwoorden te hashen met MD5, wat de beveiliging verder vergroot, je een vaste veldlengte hebt voor wachtwoorden (32 karakters) en je wachtwoorden case sensitive zijn.

Het volgende stukje is volgens mij ook leuk:
Visual Basic .NET:
1
2
3
    If objCmd.Read Then
      FormsAuthentication.RedirectFromLoginPage(strName, PersistCookie.Checked)
      objCmd.Close()

Na de redirect eindigt hij de pagina direct en voert hij de hieropvolgende statements niet uit. Oftewel: Je sluit niet al je databaseconnecties.

Meer algemeen gesproken kan je je code anders herschrijven:
Visual Basic .NET:
1
2
3
4
5
6
7
8
    If objCmd.Read Then
      FormsAuthentication.RedirectFromLoginPage(strName, PersistCookie.Checked)
      objCmd.Close()
    Else
      Msg.Text = "Ongeldig paswoord voor deze gebruiker"
      objCmd.Close()
    End If
    dbCon.Close()

Beter zou zijn:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
    If objCmd.Read Then

      FormsAuthentication.RedirectFromLoginPage(strName, PersistCookie.Checked)

    Else

      Msg.Text = "Ongeldig paswoord voor deze gebruiker"

    End If
    objCmd.Close()
    dbCon.Close()

De reden: je voert nu 2x hetzelfde uit (in beide onderdelen wordt objCmd.Close() aangeroepen; kan je net zo goed deze buiten de loop halen.

[ Voor 193% gewijzigd door gorgi_19 op 08-01-2004 22:47 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

gorgi_19 schreef op 08 januari 2004 @ 22:34:
Verder ben ik persoonlijk niet zo een fan van nesten
Visual Basic .NET:
1
2
3
4
5
  Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    If Not IsPostBack Then
      FillList()
    End If
  End Sub

Zou ik herschrijven als:
Visual Basic .NET:
1
2
3
4
5
6
 Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    If IsPostBack Then Exit Sub

    FillList()

  End Sub
dat jij er geen fan van bent moet je zelf weten, maar er is niets mis met die code, en als ik zou kiezen dan zou ik gaan voor die van de topicstarter.
Er zijn mensen die zweren bij 1 return per functie. Nou ben ik zelf niet van dat type, en ik code ook wel early-out dingen, maar dit is geen early out, dit is gewoon onzinnig een if omdraaien imho

Verder geen inhoudelijke reactie op de problemen van de topicstarter helaas :P

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

Een iets uitgebreider voorbeeld dan:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    Public Function GetPaymentAmount() As Double

        Dim result As Double
        If Me._isdead Then
            result = deadamount
        Else
            If _isSeperated Then
                result = seperatedAmount
            Else
                If _isRetired Then
                    result = retiredAmount
                Else
                    result = normalAmount
                End If
            End If
        End If
        Return result
    End Function

of:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
    Public Function GetPaymentAmount() As Double

        If Me._isdead Then Return deadamount()
        If Me._isSeperated Then Return seperatedAmount()
        If Me._isRetired Then Return retiredAmount

        Return normalAmount

    End Function

(Voor diegenenen die het voorbeeld erg bekend voorkomt: Refactoring van Fowler; Replace Nested conditional with Guard Classes)

En nu nog een andere argumentatie:
In 99% van de gevallen hoor je een submit af te vangen van If Page.IsValid en een Page_load met If Page.IsPostback als eerste regel van je method.
Om de rest van mijn procedure daarom te nesten, vind ik persoonlijk een niveau 'verspilling'.

Als mensen wel willen inspringen: geen probleem. Ik geef alleen aan dat ik er zelf geen fan van ben (en beweer ook niet dat het fout is)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ja maar je hebt het hier over een methode die slechts 1 statement heeft in slechts 1 if statement. Peanuts dus.

En fowler mag dan wel een boek geschreven hebben, dat wil natuurlijk niet per definitie zeggen dat ie altijd gelijk heeft :P

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

.oisyn schreef op 08 januari 2004 @ 22:59:
Ja maar je hebt het hier over een methode die slechts 1 statement heeft in slechts 1 if statement. Peanuts dus.
Dit blijft een kwestie van smaak waar we nooit uit zullen komen.. ;)
En fowler mag dan wel een boek geschreven hebben, dat wil natuurlijk niet per definitie zeggen dat ie altijd gelijk heeft :P
Klopt :) Hij heeft niet altijd gelijk. Maar om blind het niet aan te nemen is imho dezelfde fout als het blind altijd aan te nemen.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

gorgi_19 schreef op 08 januari 2004 @ 23:00:
[...]

Dit blijft een kwestie van smaak waar we nooit uit zullen komen.. ;)
destemeer een reden om anderen daar niet over af te vallen :P

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

.oisyn schreef op 08 januari 2004 @ 23:03:
destemeer een reden om anderen daar niet over af te vallen :P
En daarom mag ik het niet noemen als commentaar met mijn argumentatie er voor? :P * gorgi_19 is ook dol graag op kritiek op mijn opmerkingen :)

't is meer een overweging voor hem; hij moet zelf weten wat hij er mee doet of niet :)

[ Voor 27% gewijzigd door gorgi_19 op 08-01-2004 23:09 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Hij zou wel eens kunnen kijken naar parametrized queries.

Verder zou ik -zeker in het geval van Rath- ook gorgi_19's methode niet toepassen. In sommige gevallen kan het wel handig zijn om uit je method te springen als er aan een bepaalde voorwaarde niet voldaan is, maar over het algemeen vind ik dat eigenlijk ranzig.

https://fgheysels.github.io/


  • Rath
  • Registratie: April 2002
  • Laatst online: 18-02 10:59
Bedankt voor de hulp zo ver ;) die parametrized query's ga ik zeker bekijken, zelf ben ik nog niet zo lang bezig met asp.net en vb.net zie ik nu op school dus mijn kennis is dus ook nog maar het begin :7

maar heeft die foutmelding nu enkel te maken met die query's ?? of zit er nog een ander probleem achter, want die snap ik dus totaal niet :?

@gorgi_19: ik begrijp u standpunt wel met die returns, maar zelf schakel ik liever een extra variabele in en geef 1 return uit een functie enkel en alleen om het overzichtelijk te houden, maar dat is dus zuiver persoonlijk en u methode werkt uiteraard ook 8) :Y)

I don't believe we have a society, we have a colony of animals


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Rath schreef op 09 januari 2004 @ 09:13:
maar heeft die foutmelding nu enkel te maken met die query's ?? of zit er nog een ander probleem achter, want die snap ik dus totaal niet :?
Het heeft te maken met je connection-string. Je geeft aan waar je mdb-file staat, en jij geeft dat aan als een URL, en dat mag niet. Je moet een pad opgeven ala 'C:\blabla\.....\data.mdb'.
Echter, jij weet dus niet wat het echte fysieke path is waar je mdb file staat op die server, dus zal je met Server.MapPath() aan de slag moeten gaan.

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 09 januari 2004 @ 09:15:
Echter, jij weet dus niet wat het echte fysieke path is waar je mdb file staat op die server, dus zal je met Server.MapPath() aan de slag moeten gaan.
Desnoods zet je hem tijdelijk in je trace; (doe je een Response.Write(Server.Mappath(databasenaam)). Je krijgt dan de 'harde' referentie naar de database; deze kan je dan wel in je web.config zetten.

Server.Mappath gebruiken vind ik zelf een nadeel hebben; je database moet dan altijd in de webroot staan. Eventueel naar de parent gaan (dmv ../) gaat vanaf IIS 6 ook niet altijd meer werken, aangezien de default instellingn vanaf IIS 6 zijn dat Parent Paths disabled zijn.
De BaseLine Security analyzer adviseert het overigens ook vanaf IIS 5 te doen

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
gorgi_19 schreef op 09 januari 2004 @ 09:35:
[...]

Server.Mappath gebruiken vind ik zelf een nadeel hebben; je database moet dan altijd in de webroot staan. Eventueel naar de parent gaan (dmv ../) gaat vanaf IIS 6 ook niet altijd meer werken, aangezien de default instellingn vanaf IIS 6 zijn dat Parent Paths disabled zijn.
De BaseLine Security analyzer adviseert het overigens ook vanaf IIS 5 te doen
Maar dat wil dan toch niet zeggen dat je applicatie niet meer aan bestanden kan die in die root staan? Het gaat toch maar om access 'van buitenaf'? Of niet?

Trouwens, als je gebruik maakt van een 'echte' databank, heb je dat probleem niet. :P

https://fgheysels.github.io/


  • Rath
  • Registratie: April 2002
  • Laatst online: 18-02 10:59
gorgi_19 schreef op 09 januari 2004 @ 09:35:
[...]

Desnoods zet je hem tijdelijk in je trace; (doe je een Response.Write(Server.Mappath(databasenaam)). Je krijgt dan de 'harde' referentie naar de database; deze kan je dan wel in je web.config zetten.
zou je daar eens een klein vb van kunnen geven hoe je juist constanten in die web.config declareert en hoe je die in je pagina oproept, gaf tot hiertoe altijd al errors bij mij daarom dat ik het maar op een "gewone" manier deed :X
maar het is duidelijk veel handiger om dat in die web.config te plaatsen :P

I don't believe we have a society, we have a colony of animals


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

Maar dat wil dan toch niet zeggen dat je applicatie niet meer aan bestanden kan die in die root staan? Het gaat toch maar om access 'van buitenaf'? Of niet?
Je kan wel buiten je root komen, geen enkel probleem, mits je het harde pad weet (bijvoorbeeld: w:\websites\sitenaam\data\)
Echter, je kan niet meer doen iets als:

..\data

(Dit alles natuurlijk "serverside") En de reden? Het was een beveiligingsrisico :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

Rath schreef op 09 januari 2004 @ 09:44:
[...]


zou je daar eens een klein vb van kunnen geven hoe je juist constanten in die web.config declareert en hoe je die in je pagina oproept, gaf tot hiertoe altijd al errors bij mij daarom dat ik het maar op een "gewone" manier deed :X
maar het is duidelijk veel handiger om dat in die web.config te plaatsen :P
http://www.csharpfriends....Article.aspx?articleID=45

Ik denk dat dit artikel wel voldoende is; weliswaar geschreven in C#, maar niet zo heel moeilijk te vertalen naar vb.net :)

Specifiek moet je kijken naar web.config en world.aspx in de tutorial; die andere voorbeelden zijn voor winforms.

edit:

})

[ Voor 13% gewijzigd door gorgi_19 op 09-01-2004 09:49 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Rath schreef op 09 januari 2004 @ 09:44:
[...]


zou je daar eens een klein vb van kunnen geven hoe je juist constanten in die web.config declareert en hoe je die in je pagina oproept, gaf tot hiertoe altijd al errors bij mij daarom dat ik het maar op een "gewone" manier deed :X
maar het is duidelijk veel handiger om dat in die web.config te plaatsen :P
Dat staat mooi in de MSDN of in je .NET doc's uitgelegd hoor.

Pak je .NET documentatie er ff bij, en zoek eens op 'appSettings' en System.Configuration.ConfigurationSettings.AppSettings oid.

https://fgheysels.github.io/

Pagina: 1