Entwickler-Ecke
Datenbanken (inkl. ADO.NET) - Access Datenbank zum 1000ten mal
Kramer - Sa 25.10.08 12:45
Titel: Access Datenbank zum 1000ten mal
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.
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
Kha: C#-Tags hinzugefügt
Kha - Sa 25.10.08 12:50
:welcome:
Du musst Parameter durch Add erst zur Collection hinzufügen.
JüTho - 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 Execute
NonQuery ist ebenfalls ein Widerspruch. Und die Parameter müssen im Befehl auch enthalten sein, bei OleDb als '?'. Also geht so etwas:
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.AddWithValue("Wert1", "123"); cmd.ExecuteNonQuery(); cmd.CommandText = "SELECT @@Identity"; cmd.Parameters.Clear(); int Header_ID = (int)cmd.ExecuteScalar(); conn.Close(); |
Gruß Jürgen
Kramer - 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:
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
Kha: C#-Tags hinzugefügt
JüTho - Sa 25.10.08 16:11
Titel: Re: Ertmal Danke! Aber...
Kramer hat folgendes geschrieben : |
| Jetzt ist bei mir der Konten geplatzt. |
Schön, dass Dein Konto :D so voll ist, dass es platzt.
Kramer hat folgendes geschrieben : |
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:
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.
Kramer hat folgendes geschrieben : |
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 - 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 - 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 - 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ß
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!