MySQL Verbindung nicht möglich -> Ein Objekt kann nicht von DBNull in andere Typen umgewandelt werden

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von tragl.

    MySQL Verbindung nicht möglich -> Ein Objekt kann nicht von DBNull in andere Typen umgewandelt werden

    Hi, bei Google leider nix gefunden. Hab seit heute ein seltsames Problem festgestellt.
    Ich hab ein kleines Kassenprogramm programmiert, welches auf einen MariaDB-Server (Docker-Container auf meinem Homeserver) zugreift.
    Seit heute geht da nix mehr, obwohl ich weder am Programm noch sonst wo was geändert hab. Dachte trotzdem, dass es mit dem Code zusammenhängt...


    Wollte dann zu MS-SQL migrieren, mit dem SQL Server Migration Assistant bekomme ich dann allerdings den gleichen Fehler:

    Quellcode

    1. [Error: Gui] [18468/10] [2022-11-22 20:02:38]: Inner Exception #2: Ein Objekt kann nicht von DBNull in andere Typen umgewandelt werden.
    2. site: Int32 System.IConvertible.ToInt32(System.IFormatProvider)
    3. source: mscorlib
    4. bei System.DBNull.System.IConvertible.ToInt32(IFormatProvider provider)
    5. bei Microsoft.SSMA.Framework.MySql.Collector.MySqlObjectCollector.AddCharsetsAndCollationsInfo(XMetabase xMetabase, IDbConnection connection, IMySqlQueryProvider queryProvider, IUIProgressBarProvider progressBarProvider)


    Vermute jetzt einen Bug bei MariaDB - ist das Einzige, was regelmäßig Updates bekommt (im Gegensatz zu dem Kassenprogramm). Hat das jemand schonmal gehabt? Gibt's da Abhilfe für?
    Also die Connection bekommt er aufgebaut, das Abrufen von Daten schmiert dann ab. Egal ob mit Root-User oder einem "normalen" Datenbankuser

    Quellcode

    1. Connection to MySQL established successfully.
    2. Connection string: Driver={MySQL ODBC 8.0 Unicode Driver};Server=192.168.178.250;Port=3306;User=root;Option=3
    3. Error occurred while collecting data.
    4. - Ein Objekt kann nicht von DBNull in andere Typen umgewandelt werden.
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Welchen Wert hat zum Problemzeitpunkt Con?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    unmittelbar vorher:


    beim öffnen:


    Zugangsdaten/Passwörter in Bildern unkenntlich gemacht ~VaporiZed
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Ich war mal so frei und habe Deine Bilder modifiziert.
    Prüf doch mal in Deiner DB, ob ein DBNull-Werte darin gibt und setz da mal testweise was anderes ein. Denn wenn Du es zu MSSQL migrierst und der gleiche Fehler kommt, ist es eher ein Datenproblem als ein Datenanbindungsanbieterproblem.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    ob ein DBNull-Werte darin gibt

    Nö gibbet nicht, weil ich das bei keiner Spalte erlaube...
    Achso und danke für's Modifizieren - fand ich nicht wichtig, weil alles lokal bei mir läuft und das passwort zufällig generiert ist und nirgendwo anders benutzt wird ;)
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    it sounds like your connection string is not correctly escaping the values (most likely, the password); you could try:

    C#-Quellcode

    1. var cs = new DbConnectionStringBuilder();
    2. cs["SERVER"] = server;
    3. cs["DATABASE"] = database;
    4. cs["UID"] = uid;
    5. cs["PASSWORD"] = password;
    6. var connectionString = cs.ConnectionString;


    MySQL connection throws null reference

    tragl schrieb:

    geht auch
    = es funktioniert problemlos oder es kommt das gleiche Problem?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    tragl schrieb:

    @Bluespide: geht auch mit mit folgendem ConnectionString: "server=192.168.178.250;user id=Kassetest;password=test;database=Kasse_test"


    Also ich finde bei den meisten MySQL connections strings das folgende Format: server=127.0.0.1;uid=root;pwd=12345;database=test
    Woher hast du user id und password?
    @Bluespide:

    Scheint er umzuwandeln. So steht's in meinem Code: Dts._sCon = $"Server=192.168.178.250; UID=Kassetest; password=test; Initial Catalog=Kasse_test;"
    Der Connection String von oben kam dann aus der Ausgabe der Connection selbst...
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Ich hab grad mal bei der Testdatenbank die Tabellen geleert um sicher zu gehen, dass keine falschen Werte drin sind.
    Nochmal die Strukturen der einzelnen Tabellen überprüft - da gibt's nix, was DBNull erlauben würde - im DataSet ist auch keine Spalte
    drin, die das erlaubt....
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    @Bluespide: So sieht mein Connection-String codeseitig aus: Dts._sCon = $"Server=192.168.178.250;UID=Kassetest;password=test;database=Kasse_test;"
    Also genau so, wie du ihn beschrieben hast. Geht aber nicht...

    Hier mal ein großer Auszug aus'm Studio:
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „tragl“ ()

    Hat das was mit der DllNotFoundException im Screenshot zu tun?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    This is caused by MariaDB 10.10.1 making ID field Nullable in
    Information_Schema.Collations and adding a bunch of Collations that have
    null for an ID.

    jira.mariadb.org/browse/MDEV-27009

    One possible workaround is to use MariaDB 10.9 or older.

    MySqlConnection.Open() System.InvalidCastException: Object cannot be cast from DBNull to other types

    Scheint so, als hätte MariaDB aus der Spalte einfach ein Nullable gemacht und der Adapter kommt damit nicht klar. Ärgerlich.

    VaporiZed schrieb:

    Hat das was mit der DllNotFoundException im Screenshot zu tun?

    Wo siehst du die?
    Jo sauber, is zwar "schon" 10.10.2 aber scheint noch nicht gefixed zu sein... mal gucken ob ich irgendwie downgraden kann.
    Erklärt auf jeden Fall warum auf einmal meine Anwendung nicht mehr will - mariaDB bzw. der Docker wird natürlich regelmäßig geupdatet...



    Danke für's Suchen - hab ich nicht gefunden

    Edit:
    @Bluespide @ErfinderDesRades

    Ich hab nun mein MySQL.Data-Nuget durch MySQL-Connector ersetzt - es krachte dann an anderer Stelle
    mit der Batch-Verarbeitung.

    Ich musste dann die Rückgabe des PK ändern (Zeile 6). Meine Frage an euch - was genau ist der Unterschied zwischen UpdateRowSource.FirstReturnedRecord und UpdateRowSource.Both?
    Wenn ich ihn auf None stelle, dann wird der neue PK erst nach Neustart der Anwendung angezeigt, mit FirstReturnedRecord scheint's zu klappen. Kann man das so lassen?
    Wird vermutlich eh keine Dauerlösung - ich könnte so jetzt zumindest die Daten sauber von MySQL nach MS-SQL "umziehen" - aber interessieren würde es mich trotzdem ;)

    VB.NET-Quellcode

    1. Private Shared Sub TryInitAutoIncrement(tb As DataTable, insertCommand As MySqlCommand)
    2. 'Bei AutoIncrement-Primkeys wird dem Insert-CommandText ein Select-Command angehängt, welches den Db-seitig generierten Pk rücktransportiert
    3. Dim pk = tb.PrimaryKey
    4. If pk.Length <> 1 OrElse Not pk(0).AutoIncrement Then Return
    5. insertCommand.CommandText &= String.Format("; SELECT `{0}` FROM `{1}` WHERE `{0}` = LAST_INSERT_ID()", pk(0).ColumnName, tb.TableName)
    6. insertCommand.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord 'UpdateRowSource.Both
    7. End Sub


    Edit2:
    Hier mal der Fehler der mit Both kommt:
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „tragl“ ()

    @Bluespide: Screenshot Post#14, mittig, erste Zeile mit rotem Fehlersymbol
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    tragl schrieb:

    was genau ist der Unterschied zwischen UpdateRowSource.FirstReturnedRecord und UpdateRowSource.Both?
    Naja, es gibt zwei (sinnvolle) UpdateRowSource-Enum-Werte, und Both heisst wohl Both.
    Ich muss gestehen, da hab ich was verwechselt - es gibt nämlich bei der ParameterDirection auch den Enum-Wert Both, und dort bedeutet, dass der Parameter Werte auch zurücktransportiert.

    Bei UpdateRowSource scheints aber darum zu gehen, welcher Datensatz denn nu returnt werden soll, wenn das dem Insert-Command angehängte SelectCommand mehrere Ergebnisse erbringt (das kommt zwar (mit diesem Insert) nie vor, ist aber ansonsten vlt. theoretisch möglich).
    FirstReturnedRecord scheint mir da völlig sinnvoll, die anderen enum-Member weiss ich nicht, wie die gemeint sein könnten.