AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Prism Allgemeiner Datenbankzugriff unter .NET
Thema durchsuchen
Ansicht
Themen-Optionen

Allgemeiner Datenbankzugriff unter .NET

Ein Thema von Alexander · begonnen am 24. Mai 2006 · letzter Beitrag vom 4. Sep 2006
Antwort Antwort
Seite 1 von 3  1 23      
Alexander

Registriert seit: 28. Aug 2002
Ort: Oldenburg
3.513 Beiträge
 
Turbo Delphi für .NET
 
#1

Allgemeiner Datenbankzugriff unter .NET

  Alt 24. Mai 2006, 11:14
Datenbank: Alle :) • Zugriff über: ADO.NET
Hallo,
die Datenbankverbindung unter .NET ist ja eigentlich recht einfach, wenn man ADO.NET mit den entsprechenden Providern nutzt. Ich habe das gerade mal alles in eine Methode gepackt:
Delphi-Quellcode:
procedure TWinForm1.Button3_Click(sender: System.Object; e: System.EventArgs);
var
  cmd : OdbcCommand;
  con : OdbcConnection;
  dataAdapter : OdbcDataAdapter;
  DSet : DataSet;
begin
  con := OdbcConnection.Create('DSN=wall;UID=wwwrun;PWD=');
  cmd := con.CreateCommand();
  cmd.CommandText := 'SELECT * FROM WetterData';
  dataAdapter := OdbcDataAdapter.Create(cmd);
  DSet := DataSet.Create;

  dataAdapter.Fill(DSet);

  DataGrid1.DataSource := DSet;
end;
Hier greife ich ja noch über das alte ODBC auf die Datenbank zu. Dieser Weg ist ja gerade unter .NET nicht sehr optimal. Ein direkte nativer Zugriff mit den entsprechenden .NET Providern ist da ja besser und funktioniert quasi genau so. Z.B. muss ich als Datentyp ja nur den MySQLConnection oder SQLConnection statt ODBCConnection nehmen.
Ich suche aber eine Möglichkeit das allgemein zu halten und bspw. per Konfigurationsdatei wählen welche Verbindung ich nehmen möchte.
Ich habe gesehen, dass alle Klassen von einer Klasse abgeleitet wurden, bei der Connection-Klasse z.b. von IDbConnection. Also muss man mein Vorhaben irgendwie realisieren können. Hinzu kommt, dass wenn ich z.B. den MySQL-Provider direkt nehmen würde, dieser auch auf dem Zielrechner installiert sein muss. Ist dieser nicht installiert, aber in dem Programm genutzt, müsste es also zu einer Exception kommen. Es wäre also noch genialer, wenn man diese dynamisch laden könnte. Ich stelle mir das so vor:
In einem String steht z.B. Firebird oder MySQL, dann wird der entsprechende Provider verwendet, obwohl dieser nicht explizit im Quelltext genannt ist.
Ich hoffe ihr habt mich verstanden und könnt mir helfen . Für den einen oder anderen .NET Crack ist das sicherlich kein Problem .
PS: Bitte beachtet, dass ich gerade erst mit .NET angefangen habe zu spielen

Nachtrag: Zur Verdeutlichung suche ich also eine Funktion oder Methode, die mir ein DataSet zurückgibt:
Delphi-Quellcode:
function getDataSet(conString, Art, sql : String) : DataSet;
begin ... end;
Wobei Art angeben soll, wie zur Datenbank verbundne werden soll und welche überhaupt genommen wird. Also z.B. Art := MySQL;
SQL gibt das SQL-Statement an.
Nur so als Verdeutlichung
Alexander
  Mit Zitat antworten Zitat
Benutzerbild von r_kerber
r_kerber

Registriert seit: 11. Feb 2003
Ort: Trittau
3.538 Beiträge
 
Delphi XE Professional
 
#2

Re: Allgemeiner Datenbankzugriff unter .NET

  Alt 24. Mai 2006, 11:44
Zitat von Alexander:
Hinzu kommt, dass wenn ich z.B. den MySQL-Provider direkt nehmen würde, dieser auch auf dem Zielrechner installiert sein muss. Ist dieser nicht installiert, aber in dem Programm genutzt, müsste es also zu einer Exception kommen.
Den Provider mußt Du dann einfach mitliefern (wie früher die BDE). Das klappt sogar auf Web-Servern.
Ansonsten würde mir auf Anhieb BDP einfallen. Aber auch dann mußt die BDP-Assembly und den benötigten BDP-Provider mitliefern. Aber BDP ist leider nicht unumstritten (kannst Du auch hier in der DP nachlesen).
  Mit Zitat antworten Zitat
mquadrat

Registriert seit: 13. Feb 2004
1.113 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Allgemeiner Datenbankzugriff unter .NET

  Alt 24. Mai 2006, 12:10
Delphi-Quellcode:
type TDbConnectionFactory = class

  public
    class function getConnection(aConStr, aArt: string): IDbConnection;

end;

...

class function getConnection(aConStr, aArt: string): IDbCOnnection;
begin

  if (aArt = 'MySQL') then
     result := MySqlConnection.Create(aConStr)
  else if (aArt = 'Firebird') then
     result := FbConnection.Create(aConStr)
  else if (aArt = 'ODBC') then
     result := OdbcConnection.Create(aConStr);

  if (result = nil) then
    Exception.Create('Ungültige Datenbankart');

end;
Delphi-Quellcode:
  myConnection := TDbConnectionFactory.getConnection('DSN=wall;UID=wwwrun;PWD=', 'ODBC');
  ...
Das würd ich machen. Entsprechende Factorys eben auch für die anderen Sachen (z.B. Command)
  Mit Zitat antworten Zitat
Alexander

Registriert seit: 28. Aug 2002
Ort: Oldenburg
3.513 Beiträge
 
Turbo Delphi für .NET
 
#4

Re: Allgemeiner Datenbankzugriff unter .NET

  Alt 24. Mai 2006, 12:27
Zunächst erstmal vielen Dank an euch beiden
@r_kerber Klar, dass ich die Provider irgendwie mitliefern muss, wenn die genutzt werden sollen.

@mquadrat So etwas habe ich mir auch schon gedacht. Bisher habe ich es nicht ausprobiert, aber würde es krachen, wenn der MySQL-Provider nicht installiert ist, dieser im Code wie bei dir aber definiert ist, aber nicht verwendet wird? Sprich der Enduser möchte Firebird nutzen, braucht also nicht den MySQL-Provider zu installieren. Es wird also getConnection(..., 'Firebird') aufgerufen.

Außerdem stört mich noch eine Sache (daher habe ich diese Idee auch wieder verworfen gehabt) und zwar ist das ja nicht gerade dynamisch. Z.B. wurde mein Programm gerade installiert. Jetzt soll aber plötzlich zu einer ganz anderen Datenbank connected werden, die nicht in der Methode getConnection definiert ist. Diese soll aber dennoch unterstützt werden.
Ist das irgendwie möglich?
Alexander
  Mit Zitat antworten Zitat
mquadrat

Registriert seit: 13. Feb 2004
1.113 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Allgemeiner Datenbankzugriff unter .NET

  Alt 24. Mai 2006, 12:43
Dann müsstest du die Assembly des gewünschten Providers von Hand laden und die jeweiligen Klassen suchen gehen, die Namen kennst du ja nicht.

Um eine Assembly zu laden brauchst du entweder den Dateinamen oder den entsprechenden String mit dem die Assembly im GAC gefunden werden kann. Sprich der Benutzer müsste in einer Config-Datei eins von beiden eintragen oder du stellst die GAC Strings zur Verfügung und der Nutzer hakt nur an.

Die eigentliche Implementierung wäre dann trotzdem mittels einer Factory, die als Singleton implementiert ist. Die würde dann im Konstruktor die Config-Datei lesen, die entsprechende Assembly laden und die Typnamen raussuchen.
  Mit Zitat antworten Zitat
Alexander

Registriert seit: 28. Aug 2002
Ort: Oldenburg
3.513 Beiträge
 
Turbo Delphi für .NET
 
#6

Re: Allgemeiner Datenbankzugriff unter .NET

  Alt 24. Mai 2006, 12:55
Du hast nicht zufällig ein Beispiel wie man die GAC's lädt und solch ein Assembly dynamisch lädt und verwendet?
Alexander
  Mit Zitat antworten Zitat
Neelix

Registriert seit: 30. Nov 2004
Ort: Im Delta-Quadranten
84 Beiträge
 
#7

Re: Allgemeiner Datenbankzugriff unter .NET

  Alt 24. Mai 2006, 13:04
Zitat von Alexander:
Du hast nicht zufällig ein Beispiel wie man die GAC's lädt und solch ein Assembly dynamisch lädt und verwendet?
Wenn die Assembly z.B. im selben Pfad liegt, wie die Assemblys des Programmes, dann wird sie dynamisch geladen. Ein Laden in den GAC ist nicht unbedingt erforderlich (XCOPY-Installation). Dafür gäbe es dann aber das kleine Progrämmchen gacutil. das mußt Dhne Parameter starten, dann siehst Du was Du eingeben mußt.
Zitat von Alexander:
Jetzt soll aber plötzlich zu einer ganz anderen Datenbank connected werden, die nicht in der Methode getConnection definiert ist. Diese soll aber dennoch unterstützt werden.
Ist das irgendwie möglich?
IMHO mußte sowohl bei der BDE als auch bei ODBC, ADO, dbExpress, ... immer der passende DB-Treiber mitgeliefert werden. Häufig mußte auch der jeweilige DB-Client ebenfalls auf dem lokalen PC installiert sein. Das hat sich bei .Net nicht geändert. Auch "unter der Haube" von BDP befinden sich diverse DB-spezifische BDP-Provider.
Gruß von der USS Voyager

Neelix
  Mit Zitat antworten Zitat
Alexander

Registriert seit: 28. Aug 2002
Ort: Oldenburg
3.513 Beiträge
 
Turbo Delphi für .NET
 
#8

Re: Allgemeiner Datenbankzugriff unter .NET

  Alt 24. Mai 2006, 13:36
Das Tool scheint da wirklich zu helfen:
Ic habe mir gerade mal alle aufgelistet Assemblies aufgelistet. Z.B. war dabei:
Zitat:
MySql.Data, Version=1.0.7.30071, Culture=neutral, PublicKeyToken=c5687fc88969c44d, Custom=null
SCHEME: <WINDOWS_INSTALLER> ID: <MSI> DESCRIPTION : <Windows Installer>
MySql.Data, Version=1.0.7.30072, Culture=neutral, PublicKeyToken=c5687fc88969c44d, Custom=null
SCHEME: <WINDOWS_INSTALLER> ID: <MSI> DESCRIPTION : <Windows Installer>
So jetzt kann man ja mal annehmen, dass der MySQL-Treiber bei der Entwicklung nicht mit eingebungen war. Dies soll jetzt dynamisch nachgeholt werden.
Ich schätze dass ich den String MySQL.Data benötige. Wie muss ich jetzt weitermachen?

Ich habe also:
Delphi-Quellcode:
class function getConnection(aConStr, aArt: string): IDbCOnnection;
begin

  if (aArt = 'neuerProvider') then
  begin
     `hier müsste jetzt der MySQL Treiber irgendwie geladen werden...
  end
  else if (aArt = 'Firebird') then
     result := FbConnection.Create(aConStr)
  else if (aArt = 'ODBC') then
     result := OdbcConnection.Create(aConStr);

  if (result = nil) then
    Exception.Create('Ungültige Datenbankart');

end;
Alexander
  Mit Zitat antworten Zitat
mquadrat

Registriert seit: 13. Feb 2004
1.113 Beiträge
 
Delphi XE2 Professional
 
#9

Re: Allgemeiner Datenbankzugriff unter .NET

  Alt 26. Mai 2006, 11:26
Schau dir mal die Links an

Assembly.Load Method

Finden von Typen in einer Assembly

Zusammengefasst musst du, wie du schon erkannt hast den, Assemblynamen (AssemblyName Class) haben, damit du die Assembly laden kannst, dann alle in der Assembly vorhanden Typen durchsuchen bis du die Klasse findest, die von IDbConnection erbt und diese dann instanziieren.
  Mit Zitat antworten Zitat
Alexander

Registriert seit: 28. Aug 2002
Ort: Oldenburg
3.513 Beiträge
 
Turbo Delphi für .NET
 
#10

Re: Allgemeiner Datenbankzugriff unter .NET

  Alt 26. Mai 2006, 14:00
Danke, ich hoffe ich kriege es hin
Alexander
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 05:02 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