[C#] FormatException - Input string was not in the correct..

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • dj_vibri
  • Registratie: Oktober 2007
  • Laatst online: 16-09 17:16

dj_vibri

int(e^x) = f(u)^n

Topicstarter
All,

ik ben hier wat aan het prullen met ASP.NET / C# icm MySQL.
Ik heb reeds een tabel aangemaakt 'TblLogs' met hierin 2 velden: ID (autonummering) en Comment (Varchar (255)).

Ik heb ook volgende custom class aangemaakt voor het managen van de connectie:

C#:
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
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Configuration;
using MySql.Data.MySqlClient;

namespace ClassLibrary.DB
{
    public class Connectie : IDisposable
    { 
        //Local
        private String constring = ConfigurationManager.ConnectionStrings["LocalMySQLServer"].ConnectionString;
        
        protected internal MySqlConnection conn = new MySqlConnection();

        private Boolean disposed = false; //To detect redundant calls

        public Connectie()
        {
            conn.ConnectionString = constring;
        }

        protected internal void openConnectie()
        {
            try
            {
                conn.Open();
            }
            catch (MySqlException ex)
            {
                Console.Write(ex.Message);
            }
        }

        
        protected virtual void Dispose(Boolean disposing)
        {
            if (!disposed)
            {
                if (disposing)
                {
                    if (conn != null)
                    {
                        conn.Dispose();
                    }
                }
                disposed = true;
            }
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

    }
}


En in de CS file van mijn test pagina, bij page_load doe ik het volgende:

C#:
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
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI;
using System.Configuration;
using MySql.Data.MySqlClient;
using ClassLibrary.DB;

namespace ClassLibrary.Pages
{
    public partial class Testing:Page
    {
        protected internal void Page_Load(object sender, EventArgs e)
        { 
        //Local
        try
        {
            using (Connectie conn = new Connectie())
            {
                using (MySqlCommand cmd = new MySqlCommand())
                {
                    cmd.CommandType = System.Data.CommandType.Text;
                    cmd.CommandText = "INSERT INTO TblLogs (Comment) VALUES (@Message);";

                    cmd.Parameters.AddWithValue("@Message", MySqlDbType.VarChar).Value = "Test";

                    conn.openConnectie();
                    cmd.Connection = conn.conn;

                    int result = cmd.ExecuteNonQuery();
                    
                }
            }
        }
        catch (FormatException ex)
        {
            throw;
        }
        }
    }
}


Wanneer hij aan de regel 'cmd.executenonquery()' komt, springt hij bij het debuggen hierna naar de disposing functie van mijn class. Wanneer hij alles gedisposed heeft springt hij naar de Catch van bovenstaande code en geeft me de melding: Input string was not in a correct format...

Maar volgens mij staat er in de parameter toch wel degelijk een string? van het type 'varchar' ?

Last night I lay in bed looking up at the stars in the sky and I thought to myself, where the heck is the ceiling.


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:16
Volgens mij maak je verkeerd gebruik van de AddWithValue method van de Parameters collectie van het IDbCommand.

De signature van die method is als volgt:
code:
1
AddWithValue(string parameterName, object value)

Jij gebruikt ze verkeerd; ipv 'Test' door te geven als het 2de argument (de waarde die je aan de parameter wilt toekennen dus), ken je het type toe.
Dus, ofwel doe je dit:
code:
1
cmd.Parameters.AddWithValue ("@Message", "Test");

ofwel doe je dit:
code:
1
cmd.Parameters.Add ("@Message", MySqlDbType.VarChar).Value = "Test";

Waarbij de 2de method voor mij de voorkeur geniet, aangezien je daar expliciet het data-type specifieert.

On another note: ik snap het doel niet van je connectie class ? Het is gewoon een wrapper rond het IDbConnection object, voegt geen extra functionaliteit toe, en maakt ook verder geen abstractie van iets, dus wat is het nut hiervan ?

[ Voor 15% gewijzigd door whoami op 14-08-2009 09:18 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • dj_vibri
  • Registratie: Oktober 2007
  • Laatst online: 16-09 17:16

dj_vibri

int(e^x) = f(u)^n

Topicstarter
whoami schreef op vrijdag 14 augustus 2009 @ 09:10:
Volgens mij maak je verkeerd gebruik van de AddWithValue method van de Parameters collectie van het IDbCommand.

ofwel doe je dit:
code:
1
cmd.Parameters.Add ("@Message", MySqlDbType.VarChar).Value = "Test";

Waarbij de 2de method voor mij de voorkeur geniet, aangezien je daar expliciet het data-type specifieert.

On another note: ik snap het doel niet van je connectie class ? Het is gewoon een wrapper rond het IDbConnection object, voegt geen extra functionaliteit toe, en maakt ook verder geen abstractie van iets, dus wat is het nut hiervan ?
enkele seconden geleden eens getest met de .add en dit leek te werken :) maar jij had het al gevonden! :) waarvoor mijn dank! :)

Dacht dat ik ooit eens ergens gelezen had dat de .add 'obsolete' was en de voorkeur uitging naar 'addwithvalue' ? Zal wel iets verkeerd gelezen hebben :)

Wat betreft de connectie classe, dacht ik dit zo te doen omdat ik heel wat pagina's heb waar ik steeds opnieuw een connectie moet leggen/afsluiten enz.... en dit leek me makkelijker dan in elke pagina expliciet de connectionstring te gaan ophalen....

Last night I lay in bed looking up at the stars in the sky and I thought to myself, where the heck is the ceiling.


Acties:
  • 0 Henk 'm!

  • boe2
  • Registratie: November 2002
  • Niet online

boe2

'-')/

Het is handig om een aparte klasse te hebben die jouw DB connecties afhandelt inderdaad, maar zoals jij het doet kan je net zo goed meteen MySqlConnection aanroepen in je programma zelf :)

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.