Autor Beitrag
Kramer
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Sa 25.10.08 12:45 
Hallo Forum,

ja, ja, ich weiß C# und Access...

Habe folgende Frage zu der ich (auch) hier irgendwie keine befriedigende Antwort finde...

Ich möchte ganz einfach Daten in eine Access-Datenbank schreiben, ohne groß mit SQL, DataTable, DataGrid oder dergleichen.
Komme aus der VB6 Ecke und da geht sowas ganz leicht.
Also.. Datenbank heißt "Test.mdb" Tabelle heißt "Werte" in dieser Tabelle gibt es 2 Felder: "ID"-> ist der Primärschlüssel und "Wert1" als Text.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
 OleDbConnection conn =  new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=Test.mdb;");
            conn.Open();
            OleDbCommand cmd = new OleDbCommand("SELECT * FROM Werte", conn);
            cmd.Parameters.Clear();
            cmd.Parameters["Wert1"].Value = "123";
            cmd.ExecuteNonQuery();
            cmd.CommandText = "SELECT @@Identity";
            int Header_ID = (int)cmd.ExecuteScalar();
            conn.Close();

Damit bekomme ich bei: cmd.Parameters["Wert1"].Value = "123"; diese Fehlermeldung:
System.IndexOutOfRangeException wurde nicht behandelt.
Message="OleDbParameter mit ParameterName 'Wert1' ist nicht in OleDbParameterCollection enthalten.

Vielleicht hat ja von euch einer noch mal Lust mir unter die Arme zu greifen...

Vielen Dank

Moderiert von user profile iconKha: C#-Tags hinzugefügt
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 25.10.08 12:50 
:welcome:

Du musst Parameter durch Add erst zur Collection hinzufügen.

_________________
>λ=
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: Sa 25.10.08 13:00 
Hallo und ebenfalls :welcome:

Außerdem widerspricht sich Dein Code: "Daten schreiben" ist INSERT oder UPDATE, aber Du gibst SELECT vor. Ein Select-Befehl per ExecuteNonQuery ist ebenfalls ein Widerspruch. Und die Parameter müssen im Befehl auch enthalten sein, bei OleDb als '?'. Also geht so etwas:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
OleDbConnection conn = 
   new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=Test.mdb;");
conn.Open();
OleDbCommand cmd = new OleDbCommand("INSERT INTO Werte (Wert1) VALUES (?)", conn);
//  cmd.Parameters.Clear(); kann entfallen, bei einem neuen cmd gibt es sie noch nicht
cmd.Parameters.AddWithValue("Wert1""123");
cmd.ExecuteNonQuery();
cmd.CommandText = "SELECT @@Identity";
cmd.Parameters.Clear();  //  hier ist es wichtig
int Header_ID = (int)cmd.ExecuteScalar();
conn.Close();

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



BeitragVerfasst: Sa 25.10.08 14:24 
Titel: Ertmal Danke! Aber...
Danke erstmal!
Jetzt ist bei mir der Konten geplatzt.

Wenn ich jetzt in dieser Tabelle mehr Felder füllen will dann doch so:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
OleDbCommand cmd = new OleDbCommand("INSERT INTO Werte (Wert1, Wert2, Wert3) VALUES (?, ?, ?)", conn);
cmd.Parameters.AddWithValue("Wert1""123"); 
cmd.Parameters.AddWithValue("Wert2"123);
cmd.Parameters.AddWithValue("Wert3""123"); 
cmd.ExecuteNo :D nQuery();

usw. (alles erstmal ohne TRY ... CATCH)

Was mach ich jetzt wenn in dieser Tabelle bei ca. 100 Werte zum Eintragen sind?
100 Fragezeichen?


Gruß
k

Moderiert von user profile iconKha: 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: Sa 25.10.08 16:11 
Titel: Re: Ertmal Danke! Aber...
user profile iconKramer hat folgendes geschrieben Zum zitierten Posting springen:
Jetzt ist bei mir der Konten geplatzt.

Schön, dass Dein Konto :D so voll ist, dass es platzt.

user profile iconKramer hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich jetzt in dieser Tabelle mehr Felder füllen will dann doch so:
...
usw. (alles erstmal ohne TRY ... CATCH)

Korrekt. try-catch gehört um das ganze Verfahren herum. Außerdem gibt es noch eine Sicherungsmaßnahme:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
using(DbConnection conn = new DbConnection(connString)) {
    DbDataAdapter adapter = ...
    try {
       ... usw.
    } catch { ... }
    finally {
       conn.Close();
    }
}

Der using-Block kapselt die Datenverbindung.

user profile iconKramer hat folgendes geschrieben Zum zitierten Posting springen:
Was mach ich jetzt wenn in dieser Tabelle bei ca. 100 Werte zum Eintragen sind?
100 Fragezeichen?

In der Tat. Aber dann sollte eher das Datenbank-Design überarbeitet werden. 100 Felder in einer Tabelle, nein danke!

/Nachtrag
conn.Open/Close kann meistens weggelassen werden, weil z.B. DbDataAdapter das automatisch erledigt. Bei Deinem Vorgehen wird es benötigt, weil zwei DbCommands nacheinander auszuführen sind.

Jürgen

PS. Bitte gewöhn Dir an, Code-Blöcke entsprechend zu markieren. Das kannst Du auch nachträglich erledigen: Beitrag überarbeiten, Bereiche aktivieren, C# auswählen, Textteil markieren, das Plus-Zeichen drücken.
Kramer Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Sa 25.10.08 16:25 
Titel: Ohh
Natürlich Knoten!

try...catch -> ist kein Problem war nur als Zusatz gemeint.

Tja, das mit den 100 Feldern ist so eine "alte" Sünde, aber die Datenbank besteht nun mal so und es greifen da leider noch ein paar alte Programme drauf zu.

Darum sind auch meine Versuche mit DataGrid auch nicht so toll gelaufen.

Die Lösung mit den Fragezeichen hift mir jetzt erst mal, glücklich bin ich aber damit nicht so richtig.
Hab mir in der Zwischenzeit ein Datenbankbuch besorgt, auf den ersten Blick finde ich da aber auch keine "einfache" Lösung für mein Problem. Schaut mir alles ziemlich kompliziert aus.

Aber Danke noch mal. Vielleicht gibt's ja auch noch aus dem Forum ein paar Tipps;-)


Gruß
FZelle
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Di 28.10.08 16:18 
Naja und bei 100 Parametern wirst du ein Problem bekommen.
Der Jet-Treiber erlaubt per OLEDB nur Maximal ( ist kein scherz ) 99 Parameter.

Und deshalb gibt es auch keine einfachere Lösung.
Kramer Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 29.10.08 17:27 
Titel: Opps
na das kann ja noch lustig werden...

Also wenn noch eine was passendes weiß... bitte immer zu!

Gruß