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

Win XP Pro, Win Vista
C,C#(VS 2005),Java,
BeitragVerfasst: 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

ausblenden 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
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 14.01.09 10:47 
Hallo und :welcome:

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 Threadstarter
Hält's aus hier
Beiträge: 4

Win XP Pro, Win Vista
C,C#(VS 2005),Java,
BeitragVerfasst: 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:

ausblenden 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
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 14.01.09 13:02 
user profile iconMammon hat folgendes geschrieben Zum zitierten Posting springen:
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?

user profile iconMammon hat folgendes geschrieben Zum zitierten Posting springen:
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



BeitragVerfasst: Mi 14.01.09 21:20 
Wie hast du denn die Daten ausgelesen?

ausblenden 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

ausblenden 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
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 15.01.09 11:00 
user profile iconbuyden hat folgendes geschrieben Zum zitierten Posting springen:
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



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 4

Win XP Pro, Win Vista
C,C#(VS 2005),Java,
BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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
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 15.01.09 20:46 
user profile iconMammon hat folgendes geschrieben Zum zitierten Posting springen:
Die Variante zum auslesen klappt leider nicht.
ausblenden 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:
ausblenden C#-Quelltext
1:
2:
a = (string)dr["spalte"];  //  Name der Spalte
a = (string)dr[7];  //  Nummer der Spalte

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.

user profile iconMammon hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconMammon hat folgendes geschrieben Zum zitierten Posting springen:
Fehler 2 1-Argument: kann nicht von "string" in "int" konvertiert werden.

Das ist nur eine Bestätigung von Fehler 1.

user profile iconMammon hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconMammon hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconMammon hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconMammon hat folgendes geschrieben Zum zitierten Posting springen:
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



BeitragVerfasst: Do 15.01.09 21:21 
user profile iconMammon hat folgendes geschrieben Zum zitierten Posting springen:

@buyden:
Die Variante zum auslesen klappt leider nicht.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
string a;
while (dr.Read())
{
  a = dr.GetString("spalte");
}



Die Fehlermeldungen bedeuten nur, dass das Argument von GetString() kein String-Wert sein darf sondern Int.
Die Methode erwartet also den Index der Spalte, deren Wert du auslesen willst, nicht den Namen.
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 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 Threadstarter
Hält's aus hier
Beiträge: 4

Win XP Pro, Win Vista
C,C#(VS 2005),Java,
BeitragVerfasst: 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!