Autor |
Beitrag |
Mammon
Hält's aus hier
Beiträge: 4
Win XP Pro, Win Vista
C,C#(VS 2005),Java,
|
Verfasst: Mi 14.01.09 10:20
Hallo zusammen,
ich habe eine Frage bezüglich ADO.NET. Ich bin ein wahrer Anfänger was dieses Thema betrifft, und ich finde im Internet auch nicht die benötigten Informationen. Habe das Forum auch durchsucht und nichts gefunden. Ich arbeite mit einer DB von Access(2007).
Ich würde gerne wissen wie, nachdem ich die DB geöffnet habe und über
C#-Quelltext 1: 2: 3: 4:
| string strSQL = "SELECT Nummer FROM Arbeiter ";
OleDbCommand cmd = new OleDbCommand(strSQL, con); OleDbDataReader dr = cmd.ExecuteReader(); |
mir bereits Daten ausgelesen hab, ich auf diese daten zugreife und sie in eine Variable schreibe um sie im weiteren Programm zu verwenden.
Es wäre sehr nett, wenn ihr mir helfen könnten.
Mit freundlichen Grüßen
Mammon
|
|
JüTho
      
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
|
Verfasst: Mi 14.01.09 10:47
Hallo und
Ich hatte Dich schon in der PN auf das OpenBook Visual C# hingewiesen. Im Abschnitt 26.2 Das »SqlDataReader«-Objekt und in der SDK-Doku/MSDN unter OleDbDataReader (Beispiel) wird Deine Frage beantwortet (OleDb-Klassen statt Sql-Klassen benutzen).
Jürgen
PS. Das meinte ich mit "erkennbare Bemühungen".
|
|
Mammon 
Hält's aus hier
Beiträge: 4
Win XP Pro, Win Vista
C,C#(VS 2005),Java,
|
Verfasst: Mi 14.01.09 11:41
Ich hätte diesen Post nicht geschrieben wenn mir das weiter geholfen hätte.
Da ich die Daten bereits per OleDbDataReader ausgelesen habe, war die eigentliche frage wie ich von "dr" auf eine beliebige Variable(z.B. "a" die als String deklariert wurde) komme.
Ich möchte die Daten die ich dort ausgelesen habe möchte ich halt im späteren programm mit einem eingelesenen string vergleichen.
aber noch eine zusätzliche frage:
ich will die daten die ich auslese auf eine Sache begrenzen. hab mir dazu überlegt, da es ja eigentlich nen SQL-Befehl ist müsste es eigentlich so funktionieren:
C#-Quelltext 1:
| string strSQL = "SELECT Nummer FROM Arbeiter WHERE '"+ a +"'"; |
Leider macht er das nicht. Habe ich einen Denkfehler? oder liegt der fehler darin das ich das so nicht machen kann?
MfG
Mammon
|
|
JüTho
      
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
|
Verfasst: Mi 14.01.09 13:02
Mammon hat folgendes geschrieben : | Da ich die Daten bereits per OleDbDataReader ausgelesen habe, war die eigentliche frage wie ich von "dr" auf eine beliebige Variable(z.B. "a" die als String deklariert wurde) komme. |
Im Abschnitt 26.2.1 des OpenBook wird das genau beantwortet, und zwar allgemein und mit mehreren konkreten Beispielen. Was ist daran nicht klar? Soll ich das, was dort steht, hierher kopieren?
Mammon hat folgendes geschrieben : | aber noch eine zusätzliche frage:
ich will die daten die ich auslese auf eine Sache begrenzen. hab mir dazu überlegt, da es ja eigentlich nen SQL-Befehl ist müsste es eigentlich so funktionieren... |
Passt diese Frage zur Überschrift "ausgelesene Daten in nutzbare Variable"? Eher nicht. Neue Frage => neue Diskussion eröffnen. (Deshalb gibt es von mir keine Antwort dazu, auch wenn der Fehler ziemlich eindeutig ist.)
Gruß Jürgen
|
|
buyden
Hält's aus hier
Beiträge: 5
|
Verfasst: Mi 14.01.09 21:20
Wie hast du denn die Daten ausgelesen?
C#-Quelltext 1: 2: 3: 4: 5:
| string a; while (dr.Read()) { a = dr.GetString("spalte"); } |
sollte eigentlich gehen (ungetestet)
Und zu deiner 2. Frage:
1. Benutze Parameter um SQL-Injection zu vermeiden!
2. fehlt in deiner WHERE-Klausel ein Spaltenbezeichner, mit dem der Wert von a verglichen werden kann
C#-Quelltext 1: 2:
| cmdSelect.CommandText = "SELECT nummer FROM arbeiter WHERE spalte = @p1"; cmdSelect.Parameters.Add("p1", OleDbType.String).Value = a; |
(ebenfalls ungetestet)
Sollte aber eigentlich beides in dem OpenBook zu finden sein.
|
|
JüTho
      
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
|
Verfasst: Do 15.01.09 11:00
buyden hat folgendes geschrieben : | Sollte aber eigentlich beides in dem OpenBook zu finden sein. |
Eben, deshalb wollte ich nicht mehr konkret antworten. Jürgen
|
|
buyden
Hält's aus hier
Beiträge: 5
|
Verfasst: Do 15.01.09 15:55
Es gibt da auch noch ne schöne Seite zu diesem Thema:
www.seven-c.de/files/datenbankenhowto.htm
|
|
Mammon 
Hält's aus hier
Beiträge: 4
Win XP Pro, Win Vista
C,C#(VS 2005),Java,
|
Verfasst: Do 15.01.09 20:23
Ich habe mich in dem OpenBook ordenlich umgesehn. manche sachen hab ich auch nicht verstanden, bin halt noch nen anfänger. zu meiner Fragestellung wie ich die Daten in eine Variable umschreibe nachdem ich sie ausgelesen habe fand ich allerdings nichts.
@buyden:
Die Variante zum auslesen klappt leider nicht.
C#-Quelltext 1: 2: 3: 4: 5:
| string a; while (dr.Read()) { a = dr.GetString("spalte"); } |
Er gibt mir zu dem thema zwei Fehlermeldungen:
Fehler 1 Die beste Übereinstimmung für die überladene System.Data.Common.DbDataReader.GetString(int)-Methode hat einige ungültige Argumente.
Fehler 2 1-Argument: kann nicht von "string" in "int" konvertiert werden.
ich frage mich nur warum...
da a bereits ein string ist sollte er eigentlich nicht meckern.
ich war auch am überlegen, welcher datentyp in meinem fall das "dr" ist...
ein bekannter meinte das "sähe für ihn aus wie ein Stream". aber irgendwie zweifle ich daran das "dr" ein Stream sein sollte.
ich würde halt nur gern wissen, wie ich es schaffe das ein einzelner Wert aus z.b der tabelle "tab1" aus der spalte "spalte1" in eine Variable zu schreiben, die als public deklariert ist.
gibts dann eigentlich unterschiede ob es dann ein int/float- Wert ist oder nen string?
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Do 15.01.09 20:40
Nicht der Rückgabewert ist das Problem, sondern der Parameter. Der erwartet nämlich nicht den Spaltennamen, sondern den -index, siehe den entsprechenden Hilfeeintrag.
Du siehst also, der DbDataReader ist ziemlich low-levelig, weshalb für größere Projekte eher (typisierte) DataSets oder O/RMs eingestzt werden.
_________________ >λ=
|
|
JüTho
      
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
|
Verfasst: Do 15.01.09 20:46
Mammon hat folgendes geschrieben : | Die Variante zum auslesen klappt leider nicht.
C#-Quelltext 1: 2: 3: 4: 5:
| string a; while (dr.Read()) { a = dr.GetString("spalte"); } | |
Es gibt oft mehrere Möglichkeiten. Wenn Du GetString nimmst, musst Du auch die richtige Variante nehmen. Andere Möglichkeiten sind:
C#-Quelltext 1: 2:
| a = (string)dr["spalte"]; a = (string)dr[7]; |
Bei dieser Variante wird immer etwas vom Typ object zurückgegeben; deshalb muss konvertiert werden. Eigentlich wundere ich mich, warum Du nicht diese (allgemeine) Variante genommen hast.
Mammon hat folgendes geschrieben : | Er gibt mir zu dem thema zwei Fehlermeldungen:
Fehler 1 Die beste Übereinstimmung für die überladene System.Data.Common.DbDataReader.GetString(int)-Methode hat einige ungültige Argumente. |
An der Fehlermeldung siehst Du schon, dass die GetString-Methode einen int als Argument erwartet. Wenn Du in der SDK-Doku/MDSN nachliest, wirst Du feststellen, dass hier nur die Nummer der Spalte akzeptiert wird.
Mammon hat folgendes geschrieben : | Fehler 2 1-Argument: kann nicht von "string" in "int" konvertiert werden. |
Das ist nur eine Bestätigung von Fehler 1.
Mammon hat folgendes geschrieben : | ich frage mich nur warum...
da a bereits ein string ist sollte er eigentlich nicht meckern. |
Es geht eben um die Angabe der Spalte, nicht um den Inhalt.
Mammon hat folgendes geschrieben : | ich war auch am überlegen, welcher datentyp in meinem fall das "dr" ist... |
Das ist an dieser Stelle sehr wichtig. Danach richtet sich, ob Du gefahrlos (wie in meinem obigen Beispiel) auf den Wert zugreifen und konvertieren darfst und ob GetXxx verwendet werden dürfen.
Mammon hat folgendes geschrieben : | ein bekannter meinte das "sähe für ihn aus wie ein Stream". aber irgendwie zweifle ich daran das "dr" ein Stream sein sollte. |
Intern ist es vermutlich etwas wie ein Stream. Eine bessere Vorstellung dürfte aber object-Array sein.
Mammon hat folgendes geschrieben : | gibts dann eigentlich unterschiede ob es dann ein int/float- Wert ist oder nen string? |
Beim Übernehmen in die Variable und Konvertieren muss, wie gesagt, aufgepasst werden.
Jürgen
|
|
buyden
Hält's aus hier
Beiträge: 5
|
Verfasst: Do 15.01.09 21:21
|
|
JüTho
      
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
|
Verfasst: Fr 16.01.09 11:26
Danke, buyden, dass Du Kha's und meine Antwort auch noch bestätigt hast. Dreimal die gleiche Antwort sollten Mammon wirklich helfen. Sebastian und ich hatten noch weitere Hinweise, und Du? Jürgen
|
|
Mammon 
Hält's aus hier
Beiträge: 4
Win XP Pro, Win Vista
C,C#(VS 2005),Java,
|
Verfasst: Mo 19.01.09 09:58
Ich wollte mich herzlich bei euch für die Hilfe bedanken. Habe es jetzt hinbekommen und habe es auch verstanden. Danke schön!
|
|