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
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?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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();"
Ich bleib dabei: ich vermut, dass Du dem MySql Zeugs einfach MSSQL-Datentypen mitgibst und, dass das kracht.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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 😃
Die Frage ist hier eher, warum du überhaupt diese rumfrickelei machst.
Dadurch werden lesen und schreiben auf 2 respektive 4 Zeilen gekürzt.
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# 😄