Autor Beitrag
Rahvin
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Mi 21.01.09 11:02 
Hallo,

ich habe da leider ein kleines Problem. Ich versuche über eine ODBC-Verbindung auf eine MSSql-Datenbank (2005) zuzugreifen und Änderungen zu speichern. Der Zugriff funktioniert, leider bekomm ich beim Update-Versuch immer die Fehlermeldung 'Skalarvariable muss deklariert werden'.

Hier ein bißchen Code:

ausblenden volle Höhe 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:
26:
27:
28:
29:
30:
31:
32:
33:
34:
        // Füllt das DataGridView - funktioniert!!!
        private void cmdODBC_Click(object sender, EventArgs e)
        {
            try
            {
                string conStr = "DRIVER={SQL Server};SERVER=localhost;DSN=xxx;Trusted_Connection=yes;";

                OdbcConnection con = new OdbcConnection(conStr);


                da = new OdbcDataAdapter(@"SELECT Artikel.Kurztext1, Preis.ID, Preis.Vk, Preis.MengeAb, Preisliste.Name
FROM [xxx].[dbo].[Artikel], [xxx].[dbo].[Preis], [xxx].[dbo].[Preisliste]
WHERE Preis.ArtikelId = Artikel.ID AND Preis.Preisliste = Preisliste.ID AND Preisliste.ID = 2"
, con);

                OdbcCommand sqlCom = new OdbcCommand("UPDATE [xxx].[dbo].[Preis] SET Vk = @nPreis, MengeAb = @nMengeAb WHERE ID = 2");
                sqlCom.Connection = con;

                sqlCom.Parameters.Add(new OdbcParameter("@nPreis", OdbcType.Numeric, 18, ParameterDirection.Input, false00"Vk", DataRowVersion.Default, null)).Value = DBNull.Value;
                sqlCom.Parameters.Add(new OdbcParameter("@nMengeAb", OdbcType.Numeric, 18, ParameterDirection.Input, false00"MengeAb", DataRowVersion.Default, null)).Value = DBNull.Value;

                da.UpdateCommand = sqlCom;
                
                data = new DataTable();
                da.Fill(data);
                
                dgView.DataSource = data;
                dgView.Show();

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
        // Versucht die geänderten Daten zu speichern - funktioniert nicht!!!
        private void cmdSave_Click(object sender, EventArgs e)
        {
            da.Update(data.GetChanges());
        }


Hat jemand ne Idee, wo das Problem liegt? Ich bin kurz vor der Verzweifelung :(.

Gruß,
Rahvin
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: Mi 21.01.09 11:18 
Hallo,

die Ursache der Fehlermeldung liegt höchstwahrscheinlich hier:
SDK-Doku/MSDN hat folgendes geschrieben:
OdbcCommand.Parameters-Eigenschaft
In beiden Fällen muss das Fragezeichen (?) als Platzhalter verwendet werden.
Es muss also so lauten:
ausblenden C#-Quelltext
1:
2:
OdbcCommand sqlCom = new OdbcCommand
   ("UPDATE [xxx].[dbo].[Preis] SET Vk = ?, MengeAb = ? WHERE ID = 2");

Bei den Parametern ist die Verwendung "richtiger" Namen korrekt.

Aber Dein eigentlicher Fehler liegt in der Verwendung von ODBC. Dies und auch OleDb sind nur Notlösungen, wenn es nichts anderes gibt. Für den MS-SQL Server sind die Sql-Klassen aus SqlClient unbedingt vorzuziehen.

Gruß Jürgen
Rahvin Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Mi 21.01.09 13:05 
Hallo JüTho,

vielen Dank für den Tipp! Mit den SQL-Klassen hat es geklappt, sogar ohne weiter Änderungen an den Parametern ;).
Kannst Du mir vielleicht kurz erklären, wo der Unterschied zwischen den ODBC- und SQL-Klassen liegt?
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: Mi 21.01.09 13:48 
Auszug aus der SDK-Doku/MSDN:
Zitat:
Verwenden des .NET Framework-Datenanbieters für SQL Server
Der .NET Framework-Datenanbieter für SQL Server bietet Zugriff auf eine Datenbank von SQL Server, Version 7.0 oder höher, und verwendet sein eigenes Protokoll. Die Funktionen des Datenanbieters sind denen des .NET Framework-Datenanbieters für OLE DB, ODBC und Oracle angepasst.

"angepasst", aber sie passen eben genau auf den MS-SQL Server.

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
ODBC und auch OleDb sind nur Notlösungen, wenn es nichts anderes gibt.

Wenn es etwas Spezielles für eine bestimmte Datenbank gibt, kann man immer davon ausgehen, dass der Zugriff auf diese DB optimiert worden ist. Deshalb ist ein spezieller DbProvider immer besser als ein allgemeiner.

Gruß Jürgen
Rahvin Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Mi 21.01.09 14:14 
Ok,

danke nochmal für die schnelle Hilfe :).

Thema erledigt ;)...