Benutzer mit den meisten Antworten
Datenbanken - Recordset - allgemeine Fragen

Frage
-
Hallo,
kann mir bitte jemanden einen Tipp geben.
A) Wie fülle ich ein Dataset, wenn ich keine Tabelle habe, sondern ein Abfrage.Dann habe ich ja keinen Tabellennamen. siehe ####
B) Wie bekomme ich schnell heraus, ob bei der Abfrage die Spalte mit dem Namen XYZ existiert.
Ich habe z.B. 4 Spalten, nun will ich wissen, ob die Spalte "Error" zurückgeliefert wird.
C) Dataset brauche ich glaube ich nicht, reicht da der Reader.
Was ist besser? Alles mit dem MySqlDataReader zu lösen oder doch eine Datatable etc. zu verwenden.
D) Synonym zu einem Recordset ist Dataset oder Datatable?
Aus Zeitgründen kann ich mich nicht mit dem Entity Framework auseinandersetzen. Ich kann auf meine Datenbank zugreifen. Soweit alles IO. Jetzt sind es noch ein paar praktikable Tipps.
Wie bekomme ich die Anzahl der Datensätze heraus?
Wie bekomme ich die Spaltennamen?
Was nimmt Ihr als Set? Dataset, Datatable oder doch nur den MySqlDataReader .
Vielen Dank für Tipps. Wäre echt nett.
Grüße Sandra
string stm = "SELECT * FROM productWHITE"; MySqlDataAdapter da = new MySqlDataAdapter(stm, ConnectionDatabase); DataSet ds = new DataSet(); da.Fill(ds, "productWHITE"); // #### Was muss ich da eintragen, wenn ich eine // Abfrage habe? MySqlCommand cmd = new MySqlCommand(stm, ConnectionDatabase); MySqlDataReader dataReader = cmd.ExecuteReader(); DataTable dt2 = new DataTable(); dt2.Load(dataReader); int numberOfResults = dt2.Rows.Count;
- Bearbeitet Sandra Bauer Mittwoch, 25. Januar 2017 17:58 Formatierung
Antworten
-
Hallo Sandra,
vielleicht hilft dir dieses Konsolen-Beispiel etwas weiter. Du musst die Werte in der GetConnectionString()-Methode deiner Umgebung anpassen. Das Beispiel geht von einer Tabelle "productWHITE" in der DB "Test" aus.
Die Methode "MyQuery" verwendet bei Parameter=2 eine (in der DB) gespeicherte Prozedur.
Nebenbei: Kennst du das Tool "HeidiSQL"? Das ist ein nettes Tool für die MySQL-Datenbank...
using System; using System.Data; using MySql.Data.MySqlClient; namespace mysqltest { class Program { static void Main(string[] args) { var ergebnis = MyQuery(1); Console.WriteLine($"Es wurden {ergebnis.Rows.Count} Datensätze geliefert."); Console.WriteLine(); int i = 0; foreach ( DataColumn dc in ergebnis.Columns ) { Console.WriteLine($"{i++} {dc.ColumnName} {dc.DataType}"); } Console.ReadKey(); } static DataTable MyQuery(int MyQueryType = 0) { DataTable dt = new DataTable(); int ra = 0; using ( var cn = new MySqlConnection(GetConnectionString()) ) { using ( var cmd = new MySqlCommand(null, cn) ) { switch ( MyQueryType ) { case 0: cmd.CommandType = CommandType.Text; cmd.CommandText = "select * from productWHITE;"; break; case 1: cmd.CommandType = CommandType.TableDirect; cmd.CommandText = "productWHITE"; break; case 2: cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "LadeProductWHITE"; break; default: return null; } using ( var da = new MySqlDataAdapter(cmd) ) { ra = da.Fill(dt); } } } return dt; } static string GetConnectionString() { MySqlConnectionStringBuilder csb = new MySqlConnectionStringBuilder(); csb.Server = "localhost"; csb.Database = "test"; csb.UserID = "root"; csb.Password = "bla"; csb.Port = 3306; return csb.GetConnectionString(true); } } }
In der MyQuery-Methode sind die üblichen Abfragemuster in dem Switch-Block abgebildet.
Zu A.: Sieh dir die Dokumentation zur DataAdapter.Fill()-Methode mit den entsprechenden Überladungen an.
Zu B.: Durchlaufe einfach die Colums der DataTable (s. Beispiel).
Oder: DataTable.Columns.Contains("Error")Zu C.: Was du brauchst, kann dir keiner sagen. Die Frage ähnelt: Worauf habe ich Hunger? Mein Rat wäre, nimm eine DataTable. Die ist viel flexibler als sie auf den ersten Blick aussieht. Ein DataSet macht z.B. Sinn, wenn deine Abfrage mehrere Ergebnisse liefert, dass sehe ich aber gerade nicht.
Zu D.: Wenn du einen Vergleich ziehen willst, dann ähnelt die DataTable dem Recordset.
Die Fill-Methode des Dataadapters liefert die Anzahl Datensätze, die Anzahl der Rows in der Datatable tut es auch. Die Spaltennamen erhältst du aus der Betrachtung der DataTable, siehe Beispiel.
Viel Erfolg!
- Bearbeitet K. Pater Donnerstag, 26. Januar 2017 00:32
- Als Antwort markiert Sandra Bauer Donnerstag, 26. Januar 2017 18:01
Alle Antworten
-
Hi Sandra,
eine recht chaotische Auflistung von Fragen. DataSet und Recordset sind Klassen aus unterschiedlichen Welten.Zu A) Wie eine DataTable in einem DataSet heißt, kannst Du beliebig festlegen und hat mit eine Tabelle in einer externen Datenbank nichts zu tun.
Zu B) Typischerweise gibt man die Spaltennamen in einer SQL Anweisung an. Die Angabe eines Sternchens liefert alle Spalten und da braucht man nur die Fields-Auflistung der gelieferten Daten abfragen.
Zu C) Glaube ist beim Programmieren kein guter Ratgeber. Was besser ist, hängt von den Randbedingungen ab und kann mit einer Variantenbetrachtung und Entscheidungskriterien ermittelt werden. Zu beidem hast Du nichts mitgeteilt.
Zu D) Vergleichbar mit einem Recordset ist eine Auflistung von Datenobjekten, z.B. eine DataTable.
Anzahl der Datensätze: Nutze Count!
Spaltenamen: Nutze des Server Explorer
Was nutzt man: Variantenbetrachtung und Entscheidungskriterien, um Technologie auszuwählen
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks -
Wie bekomme ich die Spaltennamen?
Hi,
dynamisch? Spalten [und Tabellen-] Namen? Das ist von DB-typ zu DB-Typ verschieden...
Suche am Besten im Web nach Beispielcode für MySql...
Z.B.: Bei SqlCE war es eine [art] Tabelle, die die Infos hält "Information_Schema.Tables" und "Information_Schema.Columns". Die kann man Abfragen wie jede andere Tabelle... etwa "SELECT * FROM Information_Schema.Tables;"
In SQLite war es eine sqlite_master Struktur(ob es auch an sich eine Tabelle war, weiß ich nicht mehr...), diese Struktur lies sich jedenfalls auch Abfragen, etwa "SELECT * FROM sqlite_master WHERE type='table';"
In Access und OleDB war es auch eine Tabelle, die man erhalten konnte... etwa "conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object() {Nothing, Nothing, Nothing, "TABLE"})"
etc, etc
Viele Grüße,
Thorsten
- Bearbeitet Thorsten Gudera Mittwoch, 25. Januar 2017 23:20
-
Hallo Sandra,
vielleicht hilft dir dieses Konsolen-Beispiel etwas weiter. Du musst die Werte in der GetConnectionString()-Methode deiner Umgebung anpassen. Das Beispiel geht von einer Tabelle "productWHITE" in der DB "Test" aus.
Die Methode "MyQuery" verwendet bei Parameter=2 eine (in der DB) gespeicherte Prozedur.
Nebenbei: Kennst du das Tool "HeidiSQL"? Das ist ein nettes Tool für die MySQL-Datenbank...
using System; using System.Data; using MySql.Data.MySqlClient; namespace mysqltest { class Program { static void Main(string[] args) { var ergebnis = MyQuery(1); Console.WriteLine($"Es wurden {ergebnis.Rows.Count} Datensätze geliefert."); Console.WriteLine(); int i = 0; foreach ( DataColumn dc in ergebnis.Columns ) { Console.WriteLine($"{i++} {dc.ColumnName} {dc.DataType}"); } Console.ReadKey(); } static DataTable MyQuery(int MyQueryType = 0) { DataTable dt = new DataTable(); int ra = 0; using ( var cn = new MySqlConnection(GetConnectionString()) ) { using ( var cmd = new MySqlCommand(null, cn) ) { switch ( MyQueryType ) { case 0: cmd.CommandType = CommandType.Text; cmd.CommandText = "select * from productWHITE;"; break; case 1: cmd.CommandType = CommandType.TableDirect; cmd.CommandText = "productWHITE"; break; case 2: cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "LadeProductWHITE"; break; default: return null; } using ( var da = new MySqlDataAdapter(cmd) ) { ra = da.Fill(dt); } } } return dt; } static string GetConnectionString() { MySqlConnectionStringBuilder csb = new MySqlConnectionStringBuilder(); csb.Server = "localhost"; csb.Database = "test"; csb.UserID = "root"; csb.Password = "bla"; csb.Port = 3306; return csb.GetConnectionString(true); } } }
In der MyQuery-Methode sind die üblichen Abfragemuster in dem Switch-Block abgebildet.
Zu A.: Sieh dir die Dokumentation zur DataAdapter.Fill()-Methode mit den entsprechenden Überladungen an.
Zu B.: Durchlaufe einfach die Colums der DataTable (s. Beispiel).
Oder: DataTable.Columns.Contains("Error")Zu C.: Was du brauchst, kann dir keiner sagen. Die Frage ähnelt: Worauf habe ich Hunger? Mein Rat wäre, nimm eine DataTable. Die ist viel flexibler als sie auf den ersten Blick aussieht. Ein DataSet macht z.B. Sinn, wenn deine Abfrage mehrere Ergebnisse liefert, dass sehe ich aber gerade nicht.
Zu D.: Wenn du einen Vergleich ziehen willst, dann ähnelt die DataTable dem Recordset.
Die Fill-Methode des Dataadapters liefert die Anzahl Datensätze, die Anzahl der Rows in der Datatable tut es auch. Die Spaltennamen erhältst du aus der Betrachtung der DataTable, siehe Beispiel.
Viel Erfolg!
- Bearbeitet K. Pater Donnerstag, 26. Januar 2017 00:32
- Als Antwort markiert Sandra Bauer Donnerstag, 26. Januar 2017 18:01
-
Zu C.: Was du brauchst, kann dir keiner sagen. Die Frage ähnelt: Worauf habe ich Hunger? Mein Rat wäre, nimm eine DataTable. Die ist viel flexibler als sie auf den ersten Blick aussieht. Ein DataSet macht z.B. Sinn, wenn deine Abfrage mehrere Ergebnisse liefert, dass sehe ich aber gerade nicht.
Hallo K. Pater,
ja sicher, war aber doch sehr hilfreich!
Danke an Alle!
Viele Grüße Sandra