AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Prism Datenbankverbindung mittels ODBC (System.Data.Odbc)
Thema durchsuchen
Ansicht
Themen-Optionen

Datenbankverbindung mittels ODBC (System.Data.Odbc)

Ein Thema von MrZweig · begonnen am 20. Jun 2004 · letzter Beitrag vom 23. Jun 2004
Antwort Antwort
MrZweig

Registriert seit: 5. Mär 2004
13 Beiträge
 
Delphi 6 Professional
 
#1

Datenbankverbindung mittels ODBC (System.Data.Odbc)

  Alt 20. Jun 2004, 20:06
Hallo zusammen,

da ich heute nachmittag selbst recht lang an einer moeglichen
Loesung probiert habe, hier mein Code um eine externe oder
lokale MySQL Datenbank zu verbinden, und die enthaltenen
Daten der Tabelle in eine XML-Struktur zu laden.

Dabei muessen zusaetzlich die folgenden Namespaces in die
Uses-Anweisung eingebunden werden:
Delphi-Quellcode:
  System.Xml,
  System.Data,
  System.Data.Odbc;
Delphi-Quellcode:
procedure frmMain.DBConnect_cb;
var
  //connString: String;
  connector: OdbcConnection;
  cmd: OdbcCommand;
  adapter: OdbcDataAdapter;
  data: DataSet;
  xmlparser: XmlDataDocument;
  xmlnode: XmlNodeList;
  i: Integer;

begin
  //connString := 'DRIVER={MySQL ODBC 3.51 Driver};' +
  // 'SERVER=localhost;' +
  // 'DATABASE=myDB;' +
  // 'UID=Benutzername;' +
  // 'PASSWORD=Passwort;' +
  // 'OPTION=3';
  connector := OdbcConnection.Create();
  connector.ConnectionString := 'DSN=myDSN';
  connector.Open;

  adapter := OdbcDataAdapter.Create();
  adapter.SelectCommand := OdbcCommand.Create('SELECT * FROM table1',connector);
  data := DataSet.Create;
  adapter.Fill(data);

  xmlparser := XmlDataDocument.Create(data);
  xmlnode := xmlparser.GetElementsByTagName('spalte1');
  MessageBox.Show(IntToStr(xmlnode.Count)); // Anzahl der Datensaetze

  data.Free;
  adapter.Free;
  connector.Close;
end;
Wer jetzt einen guten Tip hat um die XML-Nodes in ein Array zu bekommen,
sodass man die Daten bearbeiten kann, waere eine sample Application
bereits komplett

Gruss,
MrZweig
--
sup sup
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#2

Re: Datenbankverbindung mittels ODBC (System.Data.Odbc)

  Alt 21. Jun 2004, 12:58
Ich glaube da fehlt noch etwas "thinking ADO.Net".

Du hast doch deine Daten in ein DataSet geschrieben. Was hindert dich daran, es zu bearbeiten?
Zum Speichern in eine XML-Datei kannst du ganz easy
DataSet.WriteXML([DateiName]); verwenden.
Hast du Constrains oder Verknüpfungen in deinem DataSet, würde ich mit
DataSet.WriteXmlSchema([DateiName]); ... das Schema als *.xsd speichern und erst danach mit ...
DataSet.WriteXml([DateiName], XmlWriteMode.IgnoreSchema); ... die Daten als *.xml.

Laden kannst du ein Schema mit:
Delphi-Quellcode:
DeinDataSet.ReadXmlSchema([DateiName]);
DeinDataSet.ReadXml([DateiName], XmlReadMode.IgnoreSchema);
Bei nur einer Tabelle klappt das absolut problemlos:
DeinDataSet.ReadXml([DateiName]);
  Mit Zitat antworten Zitat
MrZweig

Registriert seit: 5. Mär 2004
13 Beiträge
 
Delphi 6 Professional
 
#3

Re: Datenbankverbindung mittels ODBC (System.Data.Odbc)

  Alt 21. Jun 2004, 13:11
Hall Robert,

Deine Gedanken dazu sind sehr hilfreich und richtig

Allerdings will ich im Prinzip, die Daten aus dem
DataSet primaer in einem Array "behandeln", um diese
zum Beispiel weiterzuverarbeiten.

Der Weg ueber XML ist mehr eine "hilfsmethode", da ich
nicht so recht nachvollziehen kann, wie ich die Daten
aus dem DataSet Objekt in ein Arrayobjekt ueberfuehren
kann.

Hierzu vielleicht eine Anregung?

Gruss,
Sascha aka MrZweig
--
sup sup
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#4

Re: Datenbankverbindung mittels ODBC (System.Data.Odbc)

  Alt 21. Jun 2004, 13:36
Das ist eigentlich ziemlich easy (wie fast alles unter .Net )
Delphi-Quellcode:
var
  enumTable :IEnumerator;
  dtrEnum :DataRow;
begin
  // hole dir einen Enumerator für die Einträge der Tabelle
  enumTable := DeinDataSet.Tables['DeinTabelle'].Rows.GetEnumerator;

  // Zurücksetzen des Enumerators
  enumTable.Reset;

  // Iteriere durch den Enumerator
  while enumTable.MoveNext do
  begin
    // Typecase of DataRow
    dtrEnum := enumTable.Current as DataRow;
    // Mache irgendwas mit der DataRow....
  end;
end;
Nachtrag:
Willst du wirklich alles in einem Array haben:
Delphi-Quellcode:
var
  DeinArray :Array of DataRow;
begin
  setLength(DeinArray, DeinDataSet.Tables['DeineTabelle'].Rows.Count);
  DeinDataSet.Tables['DeinTabelle'].Rows.CopyTo(DeinArray, 0);
end;
  Mit Zitat antworten Zitat
MrZweig

Registriert seit: 5. Mär 2004
13 Beiträge
 
Delphi 6 Professional
 
#5

Re: Datenbankverbindung mittels ODBC (System.Data.Odbc)

  Alt 21. Jun 2004, 22:01
Ah wunderbar

Allerdings hinkt es bei mir an folgender Stelle, die ich
nicht ganz nochvollziehen kann:

Wenn ich vorher mit

Delphi-Quellcode:
  adapter := OdbcDataAdapter.Create();
  adapter.SelectCommand := OdbcCommand.Create('SELECT * FROM table1',connector);
  data := DataSet.Create;
  adapter.Fill(data);
das DataSet fuelle, sind saemtliche Rows darin enthalten (das
sehe ich anhand der XML Ausgabe).


Wenn ich aber nun mittels

  data.Tables['table1'].Rows.CopyTo(Array, 0); die Daten versuche in das Array zu schieben, bekomme ich eine NullReference-
Exception (uebrigens fast die einzige Compilermeldung mit der ich irgendwie
immer in Konfrontation gerate .

Es sieht so aus als ob ich in dem DataSet den Tablenamen nicht erreichen
kann, weil ich im SELECT bereits die Daten einer Tabelle auslese.

Denkfehler meinerseits?

UPDATE:
Ich habe jetzt mal data.Tables[0] benutzt, damit geht es dann auch. Aber
eigentlich sollte man doch auch ueber den Tablenamen die Daten abrufen
koennen. Etwas merkwuerdig.


Schoenen Abend,
Sascha
--
sup sup
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#6

Re: Datenbankverbindung mittels ODBC (System.Data.Odbc)

  Alt 23. Jun 2004, 21:30
Ich hatte nicht bemerkt, dass du geantwortet hast.

Das hier habe ich eben in C# getippt (Sorry ich hatte gerade nicht genug Nerven für D8 )

Ersetze das Wort "Oracle" mit "ODBC", die Tabelle mit deiner und den Primärschlüssel mit dem aus deiner Tabelle -> schon müsste es laufen.

Ich persönlich finde einen Array in Sachen Datenbanken in .Net vollkommen fehl am Platz.
Selbst mit DataTable.LoadDataRow kann man nicht wirklich das absolut geniale DataSet.Merge nachbilden...



Code:
void ButtonClick(object sender, System.EventArgs e)
{
  OracleDataAdapter daSelData    = new OracleDataAdapter();
  daSelData.SelectCommand        = new OracleCommand("SELECT *"+ '\n'+
                                                       "FROM  Scott.Emp t"
                                                       ,connUser);
  DataTable        tblTemp      = new DataTable("Emp");
  //Hier unnötig, da wir die Tabelle bereits benannt erzeugen
  //daSelData.TableMappings.Add(new DataTableMapping("Table1", "Emp"));

  tblTemp .BeginLoadData();
  try
  {
    daSelData.Fill(tblTemp);
  }
  finally
  {
    tblTemp.EndLoadData();
  }

// der PrimKey verhindert das Einfügen doppelter Datensätze
// Mit DataSet.Merge sind dadurch noch ganz andere Spielereien möglich ;)
  tblTemp.Constraints.Add(new UniqueConstraint("primKeyEmpNo"
                                              ,tblTemp.Columns["EMPNO"]
                                              ,true));
  if (!DeinDataSet.Tables.Contains(tblTemp.TableName))
  {
  // legt die Tabelle im ZielDataSet an, falls sie nicht schon existiert, durch Clone bekommt sie alle Spalten und Constraints,
  // aber KEINE Daten
    DeinDataSet.Tables.Add(tblTemp.Clone());
  }

// der folgende Code könnte durch diese EINE Zeile ersetzt werden
// DeinDataSet.Merge(dsTemp, false);

  DataRow[] RowsArray = (DataRow[])Array.CreateInstance(typeof(DataRow)
                                                       ,tblTemp.Rows.Count);

  tblTemp.Rows.CopyTo(RowsArray, 0);

  foreach (DataRow dtrArray in RowsArray)
  {
  // Bei LoadDataRow wird durch den PrimKey auch ein doppeltes Einfügen verhindert.
  // Eine wirkliche Synchronisierung wie bei Merge klappt damit nicht. :/
    DeinDataSet.Tables[tblTemp.TableName].LoadDataRow(dtrArray.ItemArray, true);
  }
}
  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 18:12 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