Autor Beitrag
peterd
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Di 17.06.08 14:51 
Hi Leute,

ich steh grad total auf dem Schlauch und komm einfach nicht weiter, obwohl es doch total simpel sein sollte.

Folgendes Problem:
Eine Access Datenbank auf die ich mit einer Windows Anwendung, die ich grad in C# schreibe, zugreifen kann.

Unter anderem enthällt die Datenbank eine Tabelle Namens "Seriennummern" mit 7 Spalten. Diese Tabelle würde ich mir gerne anzeigen lassen.
Also hab ich DataGridView in meine Anwednung eingefügt und es leist mir automatisch alle Datensätze aus der Tabelle. Sehr schön.
Jetzt will ich es aber so programmieren das mir im DataGridView nur die Datensätze angezeigt werden sollen, die z.B. in der Spalte 2 der Access Tabelle "abcdef" stehen haben. Oder in der Spalte 5 "12345".

Ich denke das kann wirklich nicht schwer sein aber irgendwie komm ich nicht drauf. Hab nicht mal einen Ansatz.

Also vieleicht kann mir jemand helfen.

Grüsse
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: Di 17.06.08 15:06 
Hallo,

zum Anzeigen der Daten wird ein SELECT-Befehl verwendet. Nach dem, was Du beschrieben hast, versteckt der sich in der Designer.cs eines TableAdapter. Dieser Befehl benötigt ergänzende WHERE-Bedingungen.

Sinnvoller, als jetzt irgendwelche kleine Anpassungen vorzunehmen, dürfte sein, dass Du richtig einarbeitest und auf die Hilfe des Designers möglichst verzichtest. Eine Anleitung findest Du z.B. in [url=file:///F:/Literatur/CSharp_Visual/visual_csharp_26_000.htm#Xxx999338]OpenBook Visual C# Kap.26[/url].

Jürgen
peterd Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Do 19.06.08 16:11 
Hallo ich bins nochmal.

Also das mit dem DataGrid hat jetzt geklappt.

Allerdings hab ich jetzt schon das nächste Problem wo ich nicht weiterkomme. Und zwar wenn ich ein Datensatz zu einer Tabelle hinzufügen will.

Hier mal mein Code:


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
string Datum = textBoxRepariertAm.Text;
string Von = textBoxVon.Text;
string Fehler = textBoxFehler.Text;               // Hier steht z.b. drin: Alles war kaputt, jetzt ist aber wieder alles ganz
string Seriennummer = textBoxSeriennummer2.Text;

OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Datenbank.mdb");
con.Open();
  
string strSQL = "INSERT INTO Reparaturberichte (Seriennummer, Fehlerbericht, Datum, PersonalNummer) " +
                "VALUES("+Seriennummer+","+Fehler+","+Datum+","+Von+")";

OleDbCommand cmd = new OleDbCommand(strSQL, con);
cmd.ExecuteNonQuery();



Das Problem: Beim ausführen der Zeile cmd.ExecuteNonQuery(); bekomme ich einen Fehler der da lautet:

Syntaxfehler (fehlender Operator) in Abfrageausdruck 'Alles war kaputt, jetzt ist aber wieder alles ganz'.


Wenn ich aber die INSERT INTO Zeile folgendermasen abändere: string strSQL = "INSERT INTO Reparaturberichte (Seriennummer, Fehlerbericht, Datum, PersonalNummer) " + "VALUES("+Seriennummer+",'Alles war kaputt, jetzt ist aber wieder alles ganz',"+Datum+","+Von+")";
dann funktioniert das wunderbar und er legt mir den neuen Datensatz an.
Bringt mir ja aber nix da ich den string ja variabel brauch.

Ich verstehe nicht was der Unterschied zwischen dem variablen String ist den ich ihm gebe und der Konstanten, mit der es ja fehlerfrei geht.

Vieleicht weiß ja einer Rat.

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: Do 19.06.08 17:24 
Die Lösung ist: Benutze Parameter.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
using(OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Datenbank.mdb")) {
  con.Open();

  string strSQL = "INSERT INTO Reparaturberichte (Seriennummer, Fehlerbericht, Datum, PersonalNummer) "
      + "VALUES(?, ?, ?, ?)";
  OleDbCommand cmd = new OleDbCommand(strSQL, con);
  cmd.Parameters.AddWithValue("Seriennummer", Int32.Parse(textBoxSeriennummer2.Text));
  cmd.Parameters.AddWithValue("Fehlerbericht", textBoxFehler.Text);
  cmd.Parameters.AddWithValue("Datum", DateTime.Parse(textBoxRepariertAm.Text));
  cmd.Parameters.AddWithValue("PersonalNummer", Int32.Parse(textBoxVon.Text));

  cmd.ExecuteNonQuery(); 
  con.Close();
}

Bei diesem Verfahren überlässt Du es dem DbProvider, die Hochkommata richtig zu setzen und die Werte (hier: Datum) in dem Format abzusetzen, das die Datenbank verlangt.

Das jeweilige Parse stört mich noch; besser wäre es, die Werte direkt als int bzw. DateTime zu übernehmen (z.B. durch DateTimePicker.Value); aber wenn Du alles über TextBox festlegst, geht es kaum anders.

Beachte auch den using-Block: Dadurch würde es nicht stören, wenn con.Close() vergessen wird; con.Dispose() ist ebenfalls grundsätzlich nötig, aber dadurch überflüssig.

Bei OleDb sind die Parameter durch '?' anzugeben; bei anderen DbProvider durch '@' oder ':' zusammen mit einem Namen.

Jürgen

PS. Bitte markiere Code; dazu gibt es "Bereiche" und das Plus bei C#. Das liest sich besser!
peterd Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Fr 20.06.08 07:42 
Hi,

hat geklappt vielen Dank für die schnelle Hilfe.

Um die TextBoxen werden ich wohl nicht rumkommen, der User muss ja seinen Fehlerbericht irgendwo reinschreiben.

Peter
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: Fr 20.06.08 08:49 
Der Fehlerbericht gehört natürlich in eine TextBox; der ist als String auch kein Problem. Aber für das Datum gibt es DateTimePicker; für IDs gibt es NumericUpDown oder AutoInc in der DB oder automatische Abfrage des Bearbeiters oder Auswahl aus einem weiteren DataGridView (um nur einige Möglichkeiten zu nennen).

Aber es freut mich, dass ich helfen konnte! Jürgen