[.NET en MySQL] Exception als tabel leeg is

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

  • skiwi
  • Registratie: Februari 2001
  • Laatst online: 05-04 14:13
Ik heb een werkende ODBC verbinding tussen mijn .NET applicatie en mijn MySQL database. Werkt perfect op 1 ding na: als ik een SELECT query los laat op een lege tabel in mijn database krijg ik een exception. Met IsDBNull is het mogelijk om te testen of een veld van de tabel leeg is maar kan ik ook testen of de SELECT geen resultaat oplevert?

Het gaat fout bij: klantnrLabel.Text = (result.GetInt32(0)).ToString();
Dan krijg ik een exception omdat de RESULT niks opleverde vanwege de lege tabel.

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
OdbcConnection conn = new OdbcConnection("dsn=databaseName;uid=login;pwd=password");

string cmd = "SELECT MAX(klantnr) FROM klantgegevens";
try
{
    conn.Open();
    OdbcCommand insertCMD=new OdbcCommand(cmd);
    insertCMD.Connection = conn;

    OdbcDataReader result = insertCMD.ExecuteReader(CommandBehavior.CloseConnection);
    while(result.Read())
    {
        klantnrLabel.Text = (result.GetInt32(0)).ToString();
    }
}
catch (Exception)
{
    sqlMessage.Text = "SQL Error";
}
finally
{
if (conn.State == ConnectionState.Open)
    conn.Close();
}


Iemand die een manier weet om te testen of een SELECT ook daadwerkelijk data opleverd?
Skiwi

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

kijken of de resultset leeg is?
de exception wordt niet gegooid want een lege resultset is ook een resultset

Doet iets met Cloud (MS/IBM)


  • skiwi
  • Registratie: Februari 2001
  • Laatst online: 05-04 14:13
Uhm, dat dacht ik eerst ook maar na een beetje debuggen blijkt dat while lus toch echt wordt ingegaan (of bedoel je dat niet??). Op de regel daarna (result.GetInt32(0)) krijg ik de exception. Ik vraag me dus af hoe het mogelijk is dat die while lus wordt ingegaan. Er valt toch niks te lezen uit een lege tabel?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04
Welke exception krijg je precies?

https://fgheysels.github.io/


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 31-08 15:46

mulder

ik spuug op het trottoir

Remarks
No conversions are performed, therefore the data retrieved must already be a 32-bit signed integer.

Call IsDBNull to check for null values before calling this method
uit MSDN

oogjes open, snaveltjes dicht


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Doordat je een MAX () doet, krijg je altijd een resultset terug.
Is de tabel leeg, dan geeft MAX() NULL als resultaat terug.

Never underestimate the power of


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04
Als je een select MAX() doet, moet je de functie:
code:
1
ExecuteScalar()

gebruiken ipv de functie
code:
1
ExecuteReader()

https://fgheysels.github.io/


  • skiwi
  • Registratie: Februari 2001
  • Laatst online: 05-04 14:13
Don, je hebt gelijk. Ik had het nog niet uitgeprobeerd maar was er van uitgegaan dat een lege tabel ook geen NULL zou bevatten. Is niet zo slim om daar zo maar van uit te gaan ;)

Ik heb het als volgt opgelost:

code:
1
2
3
4
5
6
7
while(result.Read())
{
    if (result.IsDBNull(0))
        klantnrLabel.Text = "Tabel is leeg";
    else
        klantnrLabel.Text = (result.GetInt32(0)).ToString();
}


Thanks!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04
Kijk ook eens naar de ExecuteScalar functie....
SqlCommand.ExecuteScalar Method
Executes the query, and returns the first column of the first row in the resultset returned by the query. Extra columns or rows are ignored.

Use the ExecuteScalar method to retrieve a single value (for example, an aggregate value) from a database. This requires less code than using the ExecuteReader method, and then performing the operations necessary to generate the single value using the data returned by a SqlDataReader.

A typical ExecuteScalar query can be formatted as in the following C# example:
code:
1
2
CommandText = "select count(*) as NumberOfRegions from region";
Int count = (int) ExecuteScalar();
Voor meer info, zie de .NET Framework SDK of de MSDN.

https://fgheysels.github.io/


  • skiwi
  • Registratie: Februari 2001
  • Laatst online: 05-04 14:13
whoami:
klopt, die functie is minder werk. Waarom ik hem niet gebruik: ik heb mijn code in een aparte class gestopt. Die roep ik dan aan met de SQL query en ik krijg het resultaat terug. Daarom maak ik ook gebruik van ExecuteReader ipv ExecuteScalar om een MAX sql query uit te voeren.

Verwijderd

moet je niet catchen als oledbexception?
bijvoorbeeld
Try
.....
Catch (Ex as OledbException)
msgbox(Ex.Message)
End Try

Verwijderd

of dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Public Sub ThrowOleDbException()
    Dim mySelectQuery As String = "SELECT column1 FROM table1"
    Dim myConnection As New OleDbConnection _
       ("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=")
    Dim myCommand As New OleDbCommand(mySelectQuery, myConnection)
    Try
        myCommand.Connection.Open()
    Catch myException As OleDbException
        Dim i As Integer
        For i = 0 To myException.Errors.Count - 1
            MessageBox.Show("Index #" + i.ToString() + ControlChars.Cr _
               + "Message: " + myException.Errors(i).Message + ControlChars.Cr _
               + "Native: " + myException.Errors(i).NativeError.ToString() + ControlChars.Cr _
               + "Source: " + myException.Errors(i).Source + ControlChars.Cr _
               + "SQL: " + myException.Errors(i).SQLState + ControlChars.Cr)
        Next i
    End Try
End Sub

  • skiwi
  • Registratie: Februari 2001
  • Laatst online: 05-04 14:13
Verwijderd schreef op 23 augustus 2002 @ 15:29:
moet je niet catchen als oledbexception?
Ja, dat doe ik ook maar om mijn vraag overzichtelijk te houden heb ik dat weggelaten. ;) Een voorbeeld van overbodige info is bv jou Visual Basic voorbeeld terwijl ik in C# programmeer.

Verwijderd

skiwi schreef op 23 augustus 2002 @ 19:43:
[...]

Ja, dat doe ik ook maar om mijn vraag overzichtelijk te houden heb ik dat weggelaten. ;) Een voorbeeld van overbodige info is bv jou Visual Basic voorbeeld terwijl ik in C# programmeer.
zielig...

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04
skiwi schreef op 23 augustus 2002 @ 19:43:
[...]

Ja, dat doe ik ook maar om mijn vraag overzichtelijk te houden heb ik dat weggelaten. ;) Een voorbeeld van overbodige info is bv jou Visual Basic voorbeeld terwijl ik in C# programmeer.


Skiwi, het is niet de bedoeling dat er kant en klare code gepost wordt. Als SoundBastard nu eenmaal in VB programmeert, dan is het niet aan hem om zijn code te gaan porten naar C# of C# te gaan leren gewoon omdat het dan voor jou beter uitkomt.
SoundBastard (en met hem zovelen) willen gewoon maar een idee aanbrengen of een bepaalde denkwijze aan u voorleggen. Als jij dat niet kunt appreciëren of als jij verlangt van enkel kant en klare oplossingen te krijgen, dan is dat jouw probleem. Jij hoeft niet op hem in te hakken, hij wil je alleen maar helpen terwijl jij enkel geholpen wilt worden.

https://fgheysels.github.io/


Verwijderd

skiwi: je error is de ToString(). Je object is Null, en die heeft geen ToString(). Je moet eerst testen op NULL, daarna de waarde eruit halen.

Dus je code wordt (even expres in VB.NET)
code:
1
2
3
4
5
6
7
8
9
insertCMD.Connection = conn
Dim result As OdbcDataReader = insertCMD.ExecuteReader(CommandBehavior.CloseConnection)
While(result.Read())
      If Not (result.Item(0) Is System.DbNull) Then
              klantnrLabel.Text = (result.GetInt32(0)).ToString()
      Else
              klantnrLabel.Text = "Tabel is leeg"
      End If
End While

Gevonden in de MSDN in ong 7 seconden.
Pagina: 1