Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[VB.NET] Probleem bij het aanroepen van een function

Pagina: 1
Acties:
  • 1.823 views sinds 30-01-2008
  • Reageer

  • rolands
  • Registratie: November 2003
  • Laatst online: 05-12-2023
Hallo,

Bij het aanroepen van een Function in VB.Net (2005 Express) krijg ik de volgende foutmelding op de code waarmee de function wordt aangeroepen:

De conversie van tekenreeks Template1 naar type Integer is ongeldig

Dit is de code waarmee de function wordt aangeroepen:

Visual Basic .NET:
1
Me.ADDomainTextBox.Text = ReadFromDataBase("ADDomainName", "Templates", TemplateComboBox.SelectedItem)


En dit is de function zelf:

Visual Basic .NET:
1
2
3
4
5
6
7
8
    Function ReadFromDataBase(ByVal SELEC As String, ByVal FROM As String, ByVal Index As Integer)
        Dim theOleDbCommand As New OleDb.OleDbCommand("SELECT " & SELEC & " FROM " & FROM & " WHERE(Department) = '" & Index & "'", New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & strDataSource & "';"))
        theOleDbCommand.Connection.Open()
        Dim theReader As OleDb.OleDbDataReader = theOleDbCommand.ExecuteReader(CommandBehavior.CloseConnection)
        While theReader.Read() = True
            Return theReader(0).ToString()
        End While
    End Function


Wat ik probeer is om een textbox te laten veranderen op basis van een item dat geselecteerd is in een combobox. Ik had dit voor elkaar maar moet dan de tekst die nu zo ongeveer in de function staat per textbox maken, dus dat moet volgens mij makkelijker kunnen in een function.

Daarnaast wordt ook nog bij End Function aangegeven:

Function 'ReadFromDataBase' doesn't return a value on all code paths. A null reference exception could occur at run time when the result is used.

Volgens mij komt dit er op neer dat de function mogelijkheid heeft om geen waarde terug te geven, maar hoe ik dit kan voorkomen zou ik ook zo niet weten, ik heb ook al geprobeerd het in een Sub te zetten, maar dat gaat ook niet zonder de nodige foutmeldingen.

Wellicht kan iemand mij wat tips geven.

Alvast bedankt,
Roland

  • fleppuhstein
  • Registratie: Januari 2002
  • Laatst online: 21-10 21:48
Function 'ReadFromDataBase' doesn't return a value on all code paths. A null reference exception could occur at run time when the result is used.

Volgens mij komt dit er op neer dat de function mogelijkheid heeft om geen waarde terug te geven, maar hoe ik dit kan voorkomen zou ik ook zo niet weten, ik heb ook al geprobeerd het in een Sub te zetten, maar dat gaat ook niet zonder de nodige foutmeldingen.
Doordat de return in een while embeded is, dan is er de kans dat er niet wordt voldaan aan je while, en dan is er geen return.

Een sub kan niks retourneren.

En het probleem zal hem in de TemplateComboBox.SelectedItem zitten, deze zal een string geven. En in de functie wordt een integer verwacht.

[ Voor 10% gewijzigd door fleppuhstein op 07-11-2007 22:16 ]


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 14:26

TeeDee

CQB 241

Even zo uit het hoofdje.

Pseudo code:
- Voor dat je je While Loop ingaat Declareer je een Dim _retval as String = ""
- In je While vul je de _retval.
- Return _retval
- Presto.

Nog wat zaakjes:
- je gebruikt "ByVal Index As Integer" terwijl je dat hele gegeven teniet doet door in je Query quotes te gebruiken.
- Je TemplateComboBox.SelectedItem returnt een ListItem, geen int.
- Je Function ReadFromDataBase returnt niks. (In C# is dat een void meen ik me te herinneren)

[ Voor 26% gewijzigd door TeeDee op 07-11-2007 22:22 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 29-11 17:06
Hmm, even vanuit mijn VB6 kennis. Je hebt een functie gemaakt maar niet aangegeven wat de return waarde is. Dat zou ik sowieso even doen. Verder houdt de melding die je krijgt in dat als je DBReader nooit een Read kan doen (recordset leeg ofzo) dat je dan geen return waarde krijgt. Wat je zou kunnen doen is een tijdelijke string gebruiken om de waarde in te zetten en die string terug returnen, dan krijg je altijd een return waarde.

Hail to the king baby!


Verwijderd

1. Doe even een Integer.Parse( TemplateComboBox.SelectedItem ) in je aanroep naar de functie
2. Het beste is om de functie een echt return type te geven.
3. Controleer in de functie of de index niet '0' is. (ervanuit gaande dat je geen 0 als index gebruikt )
4. Daarnaast moet je na de while een Return String.Empty neerzetten. dan krijg je de foutmelding niet.
5. Haal de haakjes om Department weg.

Tips
doe even een check of de database op de locatie aanwezig is.
doe een check op je connection string.. ( www.connectionstrings.com )

UBER TIP: gebruik databinding & linq uit .Net Framework 3.5 check even de Visual Studion 2008 beta2 express. Eind deze maand wordt het volledig gereleased als het goed is, dus de code zal niet meer veranderen.

Succes!! 8)

  • rolands
  • Registratie: November 2003
  • Laatst online: 05-12-2023
TeeDee schreef op woensdag 07 november 2007 @ 22:16:
Even zo uit het hoofdje.

Pseudo code:
- Voor dat je je While Loop ingaat Declareer je een Dim _retval as String = ""
- In je While vul je de _retval.
- Return _retval
- Presto.

Nog wat zaakjes:
- je gebruikt "ByVal Index As Integer" terwijl je dat hele gegeven teniet doet door in je Query quotes te gebruiken.
- Je TemplateComboBox.SelectedItem returnt een ListItem, geen int.
- Je Function ReadFromDataBase returnt niks. (In C# is dat een void meen ik me te herinneren)
Oke, bedankt voor de snelle reacties allemaal!

ik loop gelijk tegen mijn gebrek aan kennis aan, Hoe past de _retval in de while?

Roland

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 14:26

TeeDee

CQB 241

Right, even helemaal uitgekauwd ;)

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
    Function ReadFromDataBase(ByVal SELEC As String, ByVal FROM As String, ByVal Index As Integer) as String
        Dim theOleDbCommand As New OleDb.OleDbCommand("SELECT " & SELEC & " FROM " & FROM & " WHERE(Department) = '" & Index & "'", New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & strDataSource & "';"))
        theOleDbCommand.Connection.Open()
        Dim theReader As OleDb.OleDbDataReader = theOleDbCommand.ExecuteReader(CommandBehavior.CloseConnection)
Dim _retval as String = ""
        While theReader.Read() = True
            _retval = theReader(0).ToString()
        End While
Return _retval
    End Function

Zoiets dus.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • rolands
  • Registratie: November 2003
  • Laatst online: 05-12-2023
TeeDee schreef op woensdag 07 november 2007 @ 22:43:
Right, even helemaal uitgekauwd ;)

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
    Function ReadFromDataBase(ByVal SELEC As String, ByVal FROM As String, ByVal Index As Integer) as String
        Dim theOleDbCommand As New OleDb.OleDbCommand("SELECT " & SELEC & " FROM " & FROM & " WHERE(Department) = '" & Index & "'", New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & strDataSource & "';"))
        theOleDbCommand.Connection.Open()
        Dim theReader As OleDb.OleDbDataReader = theOleDbCommand.ExecuteReader(CommandBehavior.CloseConnection)
Dim _retval as String = ""
        While theReader.Read() = True
            _retval = theReader(0).ToString()
        End While
Return _retval
    End Function

Zoiets dus.
Aha, ik zie wat je doet inderaad, maar ik krijg bij het aanroepen van de functie nog wel de foutmelding:

De conversie van tekenreeks Template1 naar type Integer is ongeldig

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 14:26

TeeDee

CQB 241

Pik nog even de tips van o.a. Mistic Rain eruit.
SelectedItem is geen Integer, maar je method verwacht dat wel.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • whoami
  • Registratie: December 2000
  • Laatst online: 29-11 22:54
Verwijderd schreef op woensdag 07 november 2007 @ 22:31:

UBER TIP: gebruik databinding & linq uit .Net Framework 3.5 check even de Visual Studion 2008 beta2 express. Eind deze maand wordt het volledig gereleased als het goed is, dus de code zal niet meer veranderen.
Ik vraag me wel af waarom je dit een über tip noemt....
LINQ (for SQL) is een mooi iets, maar staat nog altijd in z'n kinderschoenen, ook al wordt het straks gereleased. Daarbij, ik denk dat NHibernate nog altijd de betere optie is als je moet kiezen tussen Linq For SQL & NHibernate bv.
Daarbij, LINQ lost an sich het probleem van de topicstarter niet op. :)

https://fgheysels.github.io/


  • elhopo
  • Registratie: December 2005
  • Laatst online: 18-11 13:49
Dat komt omdat selecteditem een string is en geen int.

Tip #99 : je kan ook de combobox meegeven aan de function
tip #131: je kan ook de listindex meegeven (dat is denk ik wat je probeert te doen)
tip #5665: Gebruik geen reserved woorden, zoals Index, daar ga je geheid een keer problemen mee krijgen. is het niet nu dan wel een andere keer. Ooit eens het woord order voor een order gebruikt in een aql statement... gaat goed fout!
Tip # 342423: advanced: gebruik geparameteriseerde query's. Als een gebruiker nu invult 'drop database ben jij wellicht je database kwijt, aangezien dit in je query als zodanig terecht kom (zoek maar eens op SQL injection)

succ6!

btw: NHibernate rouleert! wat whoami zegt dus... iig de moeite waard om eens naar te kijken, en is niet moeilijk!

[ Voor 8% gewijzigd door elhopo op 07-11-2007 23:11 ]

Blijkt dat citroenvlinders helemaal niet naar citroen smaken.


  • rolands
  • Registratie: November 2003
  • Laatst online: 05-12-2023
Inmiddels heb ik ook dit geprobeerd Integer.Parse( TemplateComboBox.SelectedItem), Maar dat gaat niet echt goed, ik krijg dan de melding:

De indeling van de invoertekenreeks is onjuist

En ook Integer.Parse( TemplateComboBox.SelectedIndex ) geeft een foutmelding:

Waarden voor een of meer vereiste parameters ontbreken

Wanneer ik vervolgens TemplateComboBox.SelectedItem gebruik zonder Integer.Parse krijg ik de melding: De conversie van tekenreeks Template1 naar type Integer is ongeldig.

Template1 is de tekst die in de combobox staat en ik heb gekozen uit de drop down list. Dit is de waarde welke wordt gebruikt in: het stukje WHERE(TemplateName) = '" & Index & "' uit de Function

Deze wordt overigens bij het laden van het Form opgehaald uit dezelfde database (tabel naam Department) dmv:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
    Private Sub SettingsForm_Load(ByVal sender As System.Object, ByVal e As _
    System.EventArgs) Handles MyBase.Load
        Dim theOleDbCommand As New OleDbCommand("SELECT TemplateName FROM Templates", New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & strDataSource & "';"))
        theOleDbCommand.Connection.Open()
        Dim theReader As OleDbDataReader = theOleDbCommand.ExecuteReader(CommandBehavior.CloseConnection)
        While theReader.Read() = True
            Me.TemplateComboBox.Items.Add(theReader(0).ToString())
        End While
    End Sub


Ik ga nog wel ff er mee aan de gang, maar dat zal morgen weer worden. Momenteel wil het ff niet lukken. Ik laat jullie wat weten zodra ik verder kom.

Uiteraard blijven tips en oplossingen welkom.

Nogmaals allen bedankt voor de reacties.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 16:23

gorgi_19

Kruimeltjes zijn weer op :9

Waarom sluit je je reader niet en hou je zo je connectie open?

[ Voor 33% gewijzigd door gorgi_19 op 08-11-2007 08:59 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 29-11 22:54
tips: parametrized queries gebruiken.
je reader en je connectie sluiten als je deze niet meer nodig hebt.

Over je probleem: kijk eens wat er in SelectedItem zit, dit zal ws niet de integer waarde zijn die je wil hebben. Heb je geen selectedvalue oid ?

https://fgheysels.github.io/


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 31-10 11:58

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • rolands
  • Registratie: November 2003
  • Laatst online: 05-12-2023
Het probleem is verholpen. Ik heb ipv index As Integer, dit aangepast naar Index As Object. Hierdoor werkt het wel.

Vooralsnog is nu de code:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
Function ReadFromDataBase(ByVal SELEC As String, ByVal FROM As String, ByVal Index As Object) As String
Dim theOleDbCommand As New OleDb.OleDbCommand("SELECT " & SELEC & " FROM " & FROM & " WHERE(TemplateName) = '" & Index & "'", New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & strDataSource & "';"))
theOleDbCommand.Connection.Open()
Dim theReader As OleDb.OleDbDataReader = theOleDbCommand.ExecuteReader(CommandBehavior.CloseConnection)
Dim _retval As String = ""        
     While theReader.Read() = True
           _retval = theReader(0).ToString()
    End While 
       Return _retval    
End Function


Bedankt voor alle ondersteuning en advies.

Roland

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 14:26

TeeDee

CQB 241

Ja, da's wel lekker makkelijk. Wat nu als je er een Datum instopt? Zomaar kans dat je query over z'n nek gaat.
Index as Object is in dit geval de easy way out. Het werkt nu ja...maar het is niet de meest ideale oplossing.

[ Voor 18% gewijzigd door TeeDee op 08-11-2007 11:47 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • whoami
  • Registratie: December 2000
  • Laatst online: 29-11 22:54
rolands schreef op donderdag 08 november 2007 @ 11:22:
Bedankt voor alle ondersteuning en advies.

Roland
Met het advies dat je hebt gekregen, heb je niks gedaan, en nu heb je het wel op een hele ranzige manier opgelost je probleem omzeild, want nu heb je gewoon een ander probleem. Zoals TeeDee al zegt.

https://fgheysels.github.io/


  • rolands
  • Registratie: November 2003
  • Laatst online: 05-12-2023
Ja, jullie hebben gelijk, het is inderdaad nu min of meer voor mij opgelost zoals het nu is, maar ideaal is het niet. Ik zal er vanavond nog eens goed induiken, om het op de nette mannier werkend te krijgen. Tot nu toe is me dat nog niet gelukt.

Roland
Pagina: 1