Autor Beitrag
Ron!N
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Di 18.10.16 09:15 
Hallo zusammen,

ich habe für eine Datenbankabfrage folgenden Code gebaut. Diesen Code verwende ich sehr häufig, weil ich an diversen Stellen Abfragen der Datenbanken benötige.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
String Abfrage_ErstZeile = "Select PrimaryKey from bestand.transfer limit 1;";

 int Primärkey = 0;
 MySqlCommand command = connection.CreateCommand();
 command.CommandText = Abfrage_ErstZeile;
 MySqlDataReader Reader;
 Reader = command4.ExecuteReader();
    while (Reader4.Read())
       {
        Primärkey = Reader4.GetInt32(0);
       }
        Reader4.Close();


Diesen Ganzen Code habe ich um eine einzige Variable (Primärkey) zu bekommen. Das ganze kommt mir doch recht aufwändig vor, daher die Frage, ob jemand von euch nicht einen besseren Weg kenn.
Ziel wäre natürlich, wenn realisierbar:

String Mit SQL Abfrage
Variable = Abfrage SQL

Danke im Voraus und viele Grüße
Ron!N

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Di 18.10.2016 um 10:16
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1177
Erhaltene Danke: 157

Windows 10 x64 Home Premium
C# (VS 2015 Enterprise)
BeitragVerfasst: Di 18.10.16 09:22 
Nein, so werden Datenbank-Abfragen gesendet.

Aber schau dir mal OR-Mapper an, das EntityFramework ist zum Beispiel ziemlich einfach zu bedienen.
Ein schöner Überblick: www.entityframeworkt...entityframework.aspx
Das mapped dir die Datenbank-Struktur auf eine Klassen-Struktur, Du arbeitest eigentlich nur noch mit den Klassen und das EF sorgt im Hintergrund dafür, dass sinnvolle Abfragen zur Datenbank gehen.

Ach und schau dir mal die using-Anweisung an.
Bei allem, was IDisposable implementiert, sollte nach der Nutzung auch Dispose aufgerufen werden.
Die using-Anweisung stellt sicher, dass das auch korrekt funktioniert.

Moderiert von user profile iconTh69: C#-Tags hinzugefügt

Für diesen Beitrag haben gedankt: Ron!N
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4345
Erhaltene Danke: 877


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 18.10.16 10:49 
Was soll den die Abfrage erreichen? Bedenke Datenbanken garantieren keine Reihenfolge wenn man keine definiert. Wenn du glaubst du bekommst immer das gleiche (nach einfügereihenfolge oder so) weil du das so beobachtet hast sieht das nur so aus.

Für diesen Beitrag haben gedankt: Ron!N
doublecross
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 125
Erhaltene Danke: 23

Windows 7
C#; Visual Studio 2015
BeitragVerfasst: Di 18.10.16 10:50 
Hallo,
user profile iconRon!N hat folgendes geschrieben Zum zitierten Posting springen:
Diesen Code verwende ich sehr häufig, weil ich an diversen Stellen Abfragen der Datenbanken benötige.


das hört sich so an, als würdest du den Code immer wieder per Copy & Paste verwenden. Wann dass der Fall ist solltest du dir sicherlich gedanken machen, wie du das am sinnvollsten in eigene Objekte/Funktionen gießen.

Also in allgemein nutzbare Funktionen wie z. B. so etwas:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
public string GetFirstValueAsString(string TableName, string FieldName)
{
  string query = string.Format("Select {0} from {1} limit 1;", FieldName, TableName);
  string result = String.Empty;
  using (MySqlCommand command = new MySqlCommand(query, connection))
  {  
    MySqlDataReader Reader = command.ExecuteReader())  
    if (Reader.Read())
    {
        result = Reader[0].ToString();
    }
    Reader.Close(); 
  }
  return result;
}


Das geht sicher noch viel schöner, soll ja auch nur ein Denkanstoß sein, aber vielleicht kannst du dir auf die Art schon viel Tipparbeit sparen denn du müsstest nur noch GetFirstValueAsString aufrufen und nicht den ganzen Code replizieren ;).

Für diesen Beitrag haben gedankt: Ron!N
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4345
Erhaltene Danke: 877


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 18.10.16 11:00 
Richtig. Aber eher ExecuteScalar verwenden anstatt einem DataReader.

Für diesen Beitrag haben gedankt: Ron!N
erfahrener Neuling
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 219
Erhaltene Danke: 10

Win 7, Win 10
C#, ASP-MVC (VS 2017 Community), MS SQL, Firebird SQL
BeitragVerfasst: Di 18.10.16 11:01 
Wenn du nur einen einzelnen Wert auslesen willst, kannst du .ExecuteScalar() verwenden.
Das würde dann so aussehen:
ausblenden C#-Quelltext
1:
int primaryKey = command.ExecuteScalar();					

Schon hast du deinen Wert

PS: Da war Ralf wohl schneller :D

Für diesen Beitrag haben gedankt: Ron!N
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4345
Erhaltene Danke: 877


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 18.10.16 11:03 
@erfahrener Neuling: casten und auf null prüfen nicht vergessen ;) ExecuteScalar liefert irgendeinen Datentyp oder eben auch null wenn die Abfrage kein Ergebnis hat.

Für diesen Beitrag haben gedankt: Ron!N
erfahrener Neuling
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 219
Erhaltene Danke: 10

Win 7, Win 10
C#, ASP-MVC (VS 2017 Community), MS SQL, Firebird SQL
BeitragVerfasst: Di 18.10.16 11:09 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
@erfahrener Neuling: casten und auf null prüfen nicht vergessen ;)
Oh natürlich kommt man ohne casten nicht weit. Danke für den Hinweis Ralf
Ron!N Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Di 18.10.16 14:37 
Hallo zusammen,

vielen Dank für die Vielen Antworten und Ideen!!!

Der Execute Scalar gefällt mir schon sehr gut.

Meine Funktion würde dann wie folgt aussehen:

ausblenden C#-Quelltext
1:
2:
String Abfrage_ErstZeile = "Select PrimaryKey from bestand.transfer limit 1;";
int primaryKey = command.ExecuteScalar();


Danach würde ich dann noch eine NULL Abfrage mit einbauen um zu schauen, ob ich überhaupt einen Treffer habe.

was genau ist denn mit casten gemeint??
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4345
Erhaltene Danke: 877


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 18.10.16 14:46 
Zitat:
was genau ist denn mit casten gemeint??


Aus ExecuteScalar kommt kein int raus(die Spalte könnte ja z.B. auch ein string sein) also mußt du die erstmal auf int casten um die einer int Variablen zuweisen zu können.
Un du solltest bedenken das wenn die Abfrage kein Ergebnis liefert da null zurückkommt.
In deinem ursprünglichen Code hast du dann für dennn Wert einfach 0 angenommen (weil du Primärkey einfach mit 0 initialisiert hast).

Äquivalent wäre also

ausblenden C#-Quelltext
1:
int primaryKey = Convert.ToInt32(command.ExecuteScalar() ?? 0); // ich konvertiere lieber als tatsächlich zu casten					

Für diesen Beitrag haben gedankt: Ron!N