Entwickler-Ecke
Datenbanken (inkl. ADO.NET) - Update mittels odbc-command
Simon_db83 - Mo 23.02.09 03:11
Titel: Update mittels odbc-command
Hallo,
ich habe folgendes Problem:
Ich habe eine Methode, die über odbc ein update durchführen soll. Allerdings bekomme ich den Fehler "ERROR ORA - 01722: ungültige Zahl". Habe schon vieles ausprobier und gegoogelt, aber noch keine Lösung gefunden.
Habe hier den quelltext:
C#-Quelltext
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:
| public void UpdateSachbearbeiter(object identity, string[] array) { try { OdbcCommand cmdUpdateSachbearbeiter = null; OdbcConnection = CreateOdbcConnection(); OdbcConnection.Open();
OdbcTransaction = OdbcConnection.BeginTransaction();
cmdUpdateSachbearbeiter = CreateOdbcCommand(@"UPDATE sachbearbeiter SET name = ? WHERE sbnr=?", this.OdbcConnection, this.OdbcTransaction);
cmdUpdateSachbearbeiter.Parameters.Add(new OdbcParameter("@sbnr", OdbcType.Numeric, 6, "sbnr")).Value = identity; cmdUpdateSachbearbeiter.Parameters.Add(new OdbcParameter("@name", OdbcType.VarChar, 50, "name")).Value = array[0]; cmdUpdateSachbearbeiter.ExecuteNonQuery();
OdbcTransaction.Commit(); } catch (OdbcException e) { OdbcTransaction.Rollback(); MessageBox.Show(e.Message); } } |
Wenn ich die einzufügenden Daten in das update - command schrebe funktioniert das, leider nicht so, wie es jetzt ist.
Hat jemand eine Idee?
Vielen Dank im Voraus
Moderiert von
Christian S.: C#-Tags hinzugefügt
JüTho - Mo 23.02.09 10:23
Hallo und :welcome:
die Fehlernummer mit ORA deutet darauf hin, dass Du mit
Oracle arbeitest. (Die Angabe des DBMS ist fast immer nützlich.) Dazu solltest Du unbedingt einen der Oracle-DbProvider verwenden, aber keinesfalls Odbc. Odbc ist nur eine Notlösung, wenn es wirklich nichts anderes gibt.
Ebenfalls eine Notlösung ist
System.Data.OracleClient, das im NET Framework enthalten ist. Besser ist einer der anderen speziellen
Oracle-Provider, der auf
ConnectionStrings [
http://www.connectionstrings.com/oracle] genannt wird: ODP.NET oder dotConnect.
Dann musst Du die Parameter anpassen, siehe z.B.
Parameter von SQL-Befehlen [
http://www.mycsharp.de/wbb2/thread.php?postid=3512876#post3512876].
Es ist zwar keine unmittelbare Erklärung zu erkennen, warum Dein Odbc-Verfahren nicht funktionieren sollte. Aber die Erfahrung zeigt, dass Oracle damit Probleme hat.
Gruß und viel Erfolg! Jürgen
PS. Bitte formatiere Deinen Code. Dazu den Textbereich markieren, "Bereiche" öffnen und das Plus neben C# anklicken. Das kannst Du auch nachträglich erledigen, dazu den ersten Beitrag zum Editieren (Button mit der Schere) öffnen. Das liest sich erheblich besser.
Simon_db83 - Mo 23.02.09 12:16
Danke für die Links.
Habe ich mir gleich angesehen.
Leider verstehe ich das mit den Providern nicht so recht.
Das ist für eine Hausarbeit in der schule. Wir haben dort die Microsoft ODBC for Oracle Schnittstelle.
Und die sollen wir verwenden.
Wie sieht denn dann so eine Provider aus bzw. welchen kann ich denn dann nehmen?
Danke im Voraus
JüTho - Mo 23.02.09 13:55
Hallo,
hast Du unter
ConnectionStrings [
http://www.connectionstrings.com/oracle] nachgelesen? Für ODP.NET und dotConnect gibt es Links "More info about...". Dort kann der Provider heruntergeladen und installiert werden. Es handelt sich in aller Regel um eine einzige DLL, die aber unter NET registriert werden muss (vorzugsweise in der machine.config). Danach kann der DbProvider (also diese Klassensammlung = Assembly = DLL) per Referenz/Verweis in der Anwendung benutzt werden.
Falls Ihr das nicht wollt (oder wegen fehlender Zugriffsrechte nicht dürft), dann nehmt wenigstens den
System.Data.OracleClient-Provider, der zusammen mit NET geliefert wird.
Die Benutzung ist "ziemlich identisch" mit jedem anderen DbProvider (wie Odbc oder Sql). Die Besonderheiten des jeweiligen DBMS müssen bei den SQL-Befehlen natürlich berücksichtigt werden; andere Abweichungen gibt es nur bei manchen Methoden.
Einzelheiten dazu stehen unter
[Artikelserie] Parameter von SQL Befehlen [
http://www.mycsharp.de/wbb2/thread.php?threadid=66704].
Eigentlich wollte ich Dir noch ein paar Argumente für den Wechsel "weg von Odbc" mitgeben. Leider finde ich sie nur verstreut. Bei den Suchergebnissen für
Oracle Provider [
http://www.mycsharp.de/wbb2/search.php?searchstring=oracle+provider&boardids%5B%5D=*&send=send] gibt es ständig Empfehlungen, weil Odbc zu langsam ist und bei Umlauten und BLOB-Feldern Probleme bringt. (Ich könnte mir vorstellen, dass die unterschiedlichen Zahlenformate bei Euch zu Problemen führen.) Vielleicht findest Du noch schlagkräftigere Argumente, die Deinen Lehrer schnell überzeugen.
Gruß Jürgen
PS. Bitte formatiere noch Deinen Quelltext! Wie das geht, habe ich schon geschrieben.
Simon_db83 - Do 26.02.09 12:23
Hi,
also mit einem DbProvider und dem ProviderString Syste.Data.OracleClient und dem entsprechenden ConnectionString funktioniert das ohne Problemen.
Danke nochmals.
JüTho - Do 26.02.09 13:25
Simon_db83 hat folgendes geschrieben : |
also mit einem DbProvider und dem ProviderString Syste.Data.OracleClient und dem entsprechenden ConnectionString funktioniert das ohne Problemen. |
Das freut mich; damit hast Du vermutlich Deinem Lehrer beigebracht, dass Odbc möglichst zu vermeiden ist.
Zur sprachlichen Korrektur: es sollte nicht "mit einem DbProvider" heißen, sondern "mit einem OracleProvider" oder "dem Oracle-Provider mit dem Namespace System.Data.OracleClient" o.ä. DbProvider ist die
allgemeine Formulierung der Klassen-Sammlung; "ohne DbProvider" geht sowieso nichts. Empfehlenswert ist ein
spezieller DbProvider für Oracle - und den habt Ihr jetzt gewählt.
In der
SDK-Doku/MSDN ist es so formuliert:
Zitat: |
Der System.Data.OracleClient-Namespace ist der .NET Framework-Datenanbieter für Oracle. (Er) beschreibt eine Auflistung von Klassen für den Zugriff auf eine Oracle-Datenquelle... |
Gruß Jürgen
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!