Autor Beitrag
Simon_db83
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 23.02.09 03:11 
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:

ausblenden 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 user profile iconChristian S.: C#-Tags hinzugefügt
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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 genannt wird: ODP.NET oder dotConnect.

Dann musst Du die Parameter anpassen, siehe z.B. Parameter von SQL-Befehlen.

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 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mo 23.02.09 13:55 
Hallo,

hast Du unter ConnectionStrings 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.

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 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 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 26.02.09 13:25 
user profile iconSimon_db83 hat folgendes geschrieben Zum zitierten Posting springen:
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