Wir entwickeln eine eigenständige Anwendung, die ihre Daten in einer Datenbank speichert. Wir verwenden Dataset- und TableAdapter für die Kommunikation mit der Datenbank. Eine der grundlegenden Anforderungen ist, dass die Anwendung in der Lage sein muss, SQL Server, Oracle und MySQL zu verwenden. Zu diesem Zweck haben wir die Abfragen in den TAs herstellerunabhängig gemacht. Wir verwenden ODBC-Anbieter.
Für SQL Server und MySQL funktioniert es gut, aber mit Oracle hatten wir Probleme. Eines der Probleme, die wir nicht überwinden können, ist der Casting-Fehler von Decimal zu Int64.
Oracle-Tabellen verwenden NUMBER(38) für System-IDs (Autoinkrement-Felder), die, wie es scheint, auf Dezimalwerte abgebildet werden. Wir verwenden jedoch Int64/long in den DataSet/TAs, da SQL Server und MySQL BIGINT verwenden. (Beachten Sie, dass die DataSEt TableAdapters anfangs automatisch aus einem SQL Server-Schema generiert wurden).
Wir erhalten eine Cast-Ausnahme, wenn wir einen NUMBER-Wert von Oracle abrufen, da er ein Dezimalobjekt zurückgibt.
DbCommand getIDcmd = connection.CreateCommand();
getIDcmd.CommandText = "select LAST_ID from SEQUENCE_ID";
sequenceID = (Int64)getIDcmd.ExecuteScalar(); // we get a cast exception here returns decimal
Bitte beachten Sie, dass wir versucht haben, die Präzisionszahl in Oracle zu verringern (z. B. NUMBER(10)), wie wir es bei anderen Forumseinträgen gesehen haben, aber ohne Erfolg.
Ist dies ein ODBC-Problem? Wenn wir zu einem anderen Anbieter wechseln, wird das Problem gelöst?