AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken C# CommandBuilder bei DbProviderFactory erzeugt Commands nicht
Thema durchsuchen
Ansicht
Themen-Optionen

CommandBuilder bei DbProviderFactory erzeugt Commands nicht

Ein Thema von Jürgen Thomas · begonnen am 2. Okt 2006 · letzter Beitrag vom 2. Okt 2006
Antwort Antwort
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#1

CommandBuilder bei DbProviderFactory erzeugt Commands nicht

  Alt 2. Okt 2006, 11:32
Datenbank: Firebird • Version: 2.0 RC4 • Zugriff über: FB-Net Provider 2.0 RC1
Hallo,

ich versuche, meinen DB-Zugriff konsequent über DbProviderFactory zu programmieren; das klappt jetzt auch:
Code:
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];
Connection klappt - das ist hier nicht das Thema. Daten ist ein typisiertes, von XSD erzeugtes DataSet.

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:
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); }
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.

Bei einem DB-spezifischen CommandBuilder wird (in Doku und Literatur) immer von folgender Reihenfolge ausgegangen (Beispiel aus Delphi-Referenz durchsuchenFB-Net-Provider):
Code:
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();
Aber auch eine andere Reihenfolge meiner Befehle oder der Ersatz durch FB-spezifische Anweisungen hat die benötigten Befehle nicht erzeugt:
Code:
//  nach Zeile 3 im zweiten Schnipsel:
cmdb[x1] = new fb.FbCommandBuilder(da[x1] as fb.FbDataAdapter);
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.").

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
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#2

Re: CommandBuilder bei DbProviderFactory erzeugt Commands ni

  Alt 2. Okt 2006, 11:37
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();
...
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#3

Re: CommandBuilder bei DbProviderFactory erzeugt Commands

  Alt 2. Okt 2006, 12:27
Zitat von Elvis:
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();
...
Danke, danke, danke! Das war (wieder mal) ein sehr guter Hinweis!

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
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz