![]() |
Datenbank: Firebird • Version: 2.0 RC4 • Zugriff über: FB-Net Provider 2.0 RC1
CommandBuilder bei DbProviderFactory erzeugt Commands nicht
Hallo,
ich versuche, meinen DB-Zugriff konsequent über DbProviderFactory zu programmieren; das klappt jetzt auch:
Code:
Connection klappt - das ist hier nicht das Thema. Daten ist ein typisiertes, von XSD erzeugtes DataSet.
using sc = System.Data.Common;
using fb = FirebirdSql.Data.FirebirdClient; // Deklaration private sc.DbProviderFactory dataFactory; private sc.DbConnection conn; // DataAdapter und CommandBuilder für jede Tabelle getrennt, // damit automatisches Update möglich ist private sc.DbDataAdapter[] da; private sc.DbCommandBuilder[] cmdb; // Verbindung zur DB vorbereiten dataFactory = sc.DbProviderFactories.GetFactory(s0); conn = dataFactory.CreateConnection(); da = new sc.DbDataAdapter[Daten.Tables.Count]; cmdb = new sc.DbCommandBuilder[Daten.Tables.Count]; Nun erzeuge ich die SelectCommands und hole mir für jede der Tabellen die Daten ins DataSet; auch das klappt (die Exception steht nur vorsorglich da):
Code:
Aber der CommandBuilder erzeugt die Insert-/Update-/Delete-Befehle nicht, obwohl sich jeder DataAdapter auf genau eine Tabelle bezieht und stets eine PrimaryKey mit einer ID definiert ist.
tbl = Daten.Tables[x1];
// DataAdapter erzeugen da[x1] = dataFactory.CreateDataAdapter(); // SelectCommand erzeugen und zuordnen da[x1].SelectCommand = dataFactory.CreateCommand(); da[x1].SelectCommand.Connection = conn; da[x1].SelectCommand.CommandText = "SELECT * FROM " + tbl.TableName; // CommandBuilder erzeugen und zuordnen cmdb[x1] = dataFactory.CreateCommandBuilder(); cmdb[x1].DataAdapter = da[x1]; // jetzt Befehle ausführen try { da[x1].Fill(Daten, tbl.TableName); } catch (Exception e) { System.Windows.Forms.MessageBox.Show(e.Message); } Bei einem DB-spezifischen CommandBuilder wird (in Doku und Literatur) immer von folgender Reihenfolge ausgegangen (Beispiel aus ![]()
Code:
Aber auch eine andere Reihenfolge meiner Befehle oder der Ersatz durch FB-spezifische Anweisungen hat die benötigten Befehle nicht erzeugt:
FbConnection myConn = new FbConnection(myConnection);
FbDataAdapter myDataAdapter = new FbDataAdapter(); myDataAdapter.SelectCommand = new FbCommand("SELECT ...", myConn); FbCommandBuilder custCB = new FbCommandBuilder(myDataAdapter); // Select ausführen myConn.Open(); myDataAdapter.Fill(custDataSet, "Employee"); myConn.Close();
Code:
Auch der explizite Aufruf von cmdb[x1].RefreshSchema() bringt nichts (abgesehen davon, dass die NET- und FB-Hilfen sich zu widersprechen scheinen: NET sagt "werden alle DbCommand-Objekte entfernt", FB sagt "Refreshes the database schema information used to generate INSERT, UPDATE, or DELETE statements.").
// nach Zeile 3 im zweiten Schnipsel:
cmdb[x1] = new fb.FbCommandBuilder(da[x1] as fb.FbDataAdapter); Bei der DB-unabhängigen Lösung kann ich nicht DbCommandBuilder(myDataAdapter) verwenden, sondern muss mit dataFactory.CreateCommandBuilder() arbeiten und danach DataAdapter zuweisen. Wie kann ich dafür sorgen, dass die benötigten Befehle erstellt werden? Oder könnte es sein, dass die FB-Version noch nicht implementiert ist (obwohl der Builder schon in Version 1.7 enthalten war)? Danke für Tipps! Jürgen |
Re: CommandBuilder bei DbProviderFactory erzeugt Commands ni
Ich benutze weder DataAdapter noch DataSets, somit habe ich wenig Erfahrung mit den normalen CommandBuildern.
Probiere aber trotzdem mal das hier:
Code:
dataAdapter.UpdateCommand = commandBuilder.GetUpdateCommand();
... |
Re: CommandBuilder bei DbProviderFactory erzeugt Commands
Zitat:
Ich hatte alle Beschreibungen und Beispiele so verstanden, dass die erzeugten Commands automatisch dem DataAdapter übergeben werden. Das ist offensichtlich nicht so; aber mit diesen drei zusätzlichen Befehlen (bei mir in einer Schleife) klappt es. So erleichterst Du mir die Arbeit! Jürgen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz