Laden...

"321" wird als INT erkannt, obwohl als String angegeben

Erstellt von Tiega vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.158 Views
T
Tiega Themenstarter:in
16 Beiträge seit 2013
vor 10 Jahren
"321" wird als INT erkannt, obwohl als String angegeben

verwendetes Datenbanksystem: MySql

Hey Leute,

ich bin gerade dabei Daten aus einer MSSql-DB in eine MySql zu schaufeln und bin jetzt über einen Fehler gestolpert.

hier ein ausschnitt aus der Reader schleife, so lese ich die Daten aus der MSSql aus:


while (reader.Read())
            {
                typen[0] = reader[0].ToString();
                typen[1] = reader[1].ToString();
                if (typen[1] == "")
                {
                    typen[1] = null;
                }
                typen[2] = reader[2].ToString();
                if (typen[2] == "")
                {
                    typen[2] = null;
                }
                typen[3] = reader[3].ToString();
                if (typen[3] == "")
                {
                    typen[3] = null;
                }
                typen[4] = reader[4].ToString();
                if (typen[4] == "")
                {
                    typen[4] = null;
                }
                typen[5] = reader[5].ToString();
                if (typen[5] == "")
                {
                    typen[5] = null;
                }
                typenListe.Add(typen);
                typen = new string[10];

            }
            reader.Close();

Und weiter unten nach einigen Aufbereitungen will ich die wie folgt in die MySql schreiben.


command = new MySql.Data.MySqlClient.MySqlCommand();
                conn = new MySql.Data.MySqlClient.MySqlConnection();
                conn.ConnectionString = myConnectionString;
                conn.Open();
                command.Connection = conn;
                command.CommandText = "INSERT INTO maschinen_typen VALUES (null, @bezeichnung, @serie, @hersteller, @kategorie, @notizen, @pressX)";
                command.Prepare();
                command.Parameters.Add("@bezeichnung", MySql.Data.MySqlClient.MySqlDbType.VarChar);
                command.Parameters.Add("@serie", SqlDbType.Int);
                command.Parameters.Add("@hersteller", SqlDbType.Int);
                command.Parameters.Add("@kategorie", SqlDbType.Int);
                command.Parameters.Add("@notizen", MySql.Data.MySqlClient.MySqlDbType.VarChar);
                command.Parameters.Add("@pressX", SqlDbType.Int);
                foreach (string[] t_typen in t_typenListe)
                {
                    command.Parameters["@bezeichnung"].Value = t_typen[0];
                    command.Parameters["@serie"].Value = t_typen[1];
                    command.Parameters["@hersteller"].Value = t_typen[2];
                    command.Parameters["@kategorie"].Value = t_typen[3];
                    command.Parameters["@notizen"].Value = t_typen[4];
                    command.Parameters["@pressX"].Value = t_typen[5];
                    textBox.Text = t_typen[0] + "\r\n";
                    if (t_typen[2] != null)
                    {
                        command.ExecuteNonQuery();
                    }                    

                }
                conn.Close();

Jetzt kommt nach 2030 Datensätzen der Fehler das "@bezeichnung" das falsche Format hat, wird als INT geshen. In der Variable/Parameter ist auch der Wert "321" aber warum will der das unbedingt als INT anerkennen? Ich mein es kommt doch aus einem String-Array und selbst mit ".ToString()" oder einem cast ändert sich nicht an dem Fehler.

Jemand eine Idee?

Vielen Danke

16.806 Beiträge seit 2008
vor 10 Jahren

Muss das wirklich so sein, dass Du manchmal mit MySql-Typen Enum arbeitest, und manchmal mit MSSQL? Das sieht alles andre als korrekt aus.

Davon abgesehen war - zumindest mein letzter mySQL Stand - dass Beschreibungen und Texte mit TEXT oder BLOB gespeichert werden sollen, nicht mir Varchar.

Hast Du den Fehler als Originaltext mit genauer Zeile?

T
Tiega Themenstarter:in
16 Beiträge seit 2013
vor 10 Jahren

Ganz ehrlich, ich habe noch nie in der Kombination C#/MySql gearbeitet und hab mir schnell gefährliches Halbwissen zusammengegooglet >.<

Ich hab das jetzt auch mal mit "TEXT" versucht kommt aber der gleiche fehler:

Fehlermeldung:
System.FormatException: Die Eingabezeichenfolge hat das falsche Format.
bei System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
bei System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
bei System.String.System.IConvertible.ToInt32(IFormatProvider provider)
bei System.Convert.ToInt32(Object value)
bei MySql.Data.Types.MySqlInt32.MySql.Data.Types.IMySqlValue.WriteValue(MySqlPacket packet, Boolean binary, Object val, Int32 length)
bei MySql.Data.MySqlClient.MySqlParameter.Serialize(MySqlPacket packet, Boolean binary, MySqlConnectionStringBuilder settings)
bei MySql.Data.MySqlClient.Statement.SerializeParameter(MySqlParameterCollection parameters, MySqlPacket packet, String parmName, Int32 parameterIndex)
bei MySql.Data.MySqlClient.Statement.InternalBindParameters(String sql, MySqlParameterCollection parameters, MySqlPacket packet)
bei MySql.Data.MySqlClient.Statement.BindParameters()
bei MySql.Data.MySqlClient.Statement.Execute()
bei MySql.Data.MySqlClient.PreparableStatement.Execute()
bei MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
bei MySql.Data.MySqlClient.MySqlCommand.ExecuteReader()
bei MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()
bei MSSQLToMySql.Form1.typenImport_Click(Object sender, EventArgs e)

PS:Sry Zeile nicht mitkopiert >.<... "ZEILE: 433 command.ExecuteNonQuery();"

16.806 Beiträge seit 2008
vor 10 Jahren

Ich bleib dabei: ich vermut, dass Du dem MySql Zeugs einfach MSSQL-Datentypen mitgibst und, dass das kracht.

T
Tiega Themenstarter:in
16 Beiträge seit 2013
vor 10 Jahren

Okay hab es jetzt mal auf deine Vermutung hin geändert in:


command = new MySql.Data.MySqlClient.MySqlCommand();
                conn = new MySql.Data.MySqlClient.MySqlConnection();
                conn.ConnectionString = myConnectionString;
                conn.Open();
                command.Connection = conn;
                command.CommandText = "INSERT INTO maschinen_typen VALUES (null, @bezeichnung, @serie, @hersteller, @kategorie, @notizen, @pressX)";
                command.Prepare();
                command.Parameters.Add("@bezeichnung", MySql.Data.MySqlClient.MySqlDbType.Text);
                command.Parameters.Add("@serie", MySql.Data.MySqlClient.MySqlDbType.Int32);
                command.Parameters.Add("@hersteller", MySql.Data.MySqlClient.MySqlDbType.Int32);
                command.Parameters.Add("@kategorie", MySql.Data.MySqlClient.MySqlDbType.Int32);
                command.Parameters.Add("@notizen", MySql.Data.MySqlClient.MySqlDbType.Text);
                command.Parameters.Add("@pressX", MySql.Data.MySqlClient.MySqlDbType.Int32);
                foreach (string[] t_typen in t_typenListe)
                {
                    command.Parameters["@bezeichnung"].Value = t_typen[0];
                    command.Parameters["@serie"].Value = t_typen[1];
                    command.Parameters["@hersteller"].Value = t_typen[2];
                    command.Parameters["@kategorie"].Value = t_typen[3];
                    command.Parameters["@notizen"].Value = t_typen[4];
                    command.Parameters["@pressX"].Value = t_typen[5];
                    textBox.Text = t_typen[0] + "\r\n";
                    if (t_typen[2] != null)
                    {
                        command.ExecuteNonQuery();
                    }                    

                }
                conn.Close();

Sollte ja so alles in MySql-Typen sein, kracht aber trotzdem an der gleichen stelle 😦

Sonst noch eine Idee?

EDIT:

Okay hab den Fehler gefunden, es lag gar nicht an der "321" sondern an der "Serie" da ist mir bei der Aufbereitung ein Fehler unterlaufen >.< da stand nämlich ein STRING drin obwohl INT gefordert war.

Ist natürlich super wenn man bei der Fehlersuche von Anfang an den falschen Ansatz hat 😄

Trotzdem Danke 😃

F
10.010 Beiträge seit 2004
vor 10 Jahren

Die Frage ist hier eher, warum du überhaupt diese rumfrickelei machst.

  1. Benutze einen SqlDataAdapter und eine DataTable zum einlesen.
  2. Setze http://msdn.microsoft.com/de-de/library/system.data.common.dataadapter.acceptchangesduringfill(v=vs.110).aspx
  3. Arbeite in der DataTable.
  4. Benutze MySqlDataAdapter, MySqlCommandBuilder zum update.

Dadurch werden lesen und schreiben auf 2 respektive 4 Zeilen gekürzt.

T
Tiega Themenstarter:in
16 Beiträge seit 2013
vor 10 Jahren

Joa wie schon gesagt das ist ja nur eine 1 malige Sache und dafür hab ich mir das nötigste zusammengegoogelt^^

Bin nicht wirklich fit in C# 😄