Autor Beitrag
Peter18
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Do 20.02.14 19:46 
Ein freundliches Hallo an alle,

ich versuche mich gerade mit Datenbanken und möchte auf belibige Datenbanken zugreifen. Leider habe ich kaum Unterlagen dazu und habe bisher auch keine passende Beschreibung gefunden und das verfügbare Material im Internet ist hochgradig unübersichtlich.

Ich verwende das "Museumsstück" Delphi 4. Der Zugriff auf Datenbanken, die Delphi 4 mitbringt klappt inzwischen. Über einen Alias in der BDE oder TDatabase kann ich inzwischen zugreifen.

Wenn ich jedoch versuche eine Verbindung zu Accsess oder Excel aufzubauen erscheinen Fehlermeldungen. Es sieht so aus, als ob Delphi 4 DAO verwendet und MS jetzt auf ADO setzt.
So ganz peil ich das noch nicht. Vielleicht kann mir jemand eine Übersicht geben oder eine Beschreibung oder freie Software nennen, die mir einen Einstieg verschafft.

Was ich bisher gefunden habe beschreibt Deteils, doch es fehlt die Übersicht! Ich hoffe jemand hat einen guten Tipp auf Lager.

Grüße von der Nordsee und Dank im Voraus

Peter
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Mo 03.03.14 15:47 
Nochmals ein Hallo an alle,

ich hoffe noch immer irgend jemand hat einen Tipp auf Lager, der mich weiter bringt. Ich habe weiter geforscht, doch noch immer treten Fehler auf. Noch habe ich keine vernünftige Übersicht gefunden, immer nur Informationsfetzen. Auf der Internetseite "http://www.connectionstrings.com" konnte ich zwar eine Reihe Beispiele finden, doch der Durchbruch waren sie nicht.

Auch Datenbankzugriff über ADO in Delphi war aufzutreiben, doch es kommt zu der Fehlermeldung: "[DBNETLIB][ConnectionOpen (ParseConnectParams()).]Ungültige Verbindung." Irgend etwas fehlt anscheinend noch. Hier das Programm:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
  Source               := TADODataSet.Create( Self );
  Source.ConnectParams := 'Provider=SQLOLEDB;'                                                       +
                          'Data Source=C:\Programme\Microsoft Office\Office10\Samples\Nordwind.mdb;' +
                          'User Id=User;'                                                             ;
  Source.Name          := 'Test'       ;
  Source.Provider      := 'sqloledb'   ;     
  Source.Source        := 'C:\Programme\Microsoft Office\Office10\Samples\Nordwind.mdb';  
  Source.Username      := 'User';      
  DataSource1.DataSet  := Source;
  Source.Active        := true  ;


Diese Routine wird Aufgerufen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
procedure TADODataSet.InternalOpen;
begin
  if not Assigned(ADOConnection) then
  begin
    ADOConnection := CoConnection.Create;
  end;
  ADOConnection.CursorLocation := adUseClient;
  if fCatalog='' then
    ADOConnection.Open('Provider = '  + fProvider + ';' +
                     'Data Source = ' + fSource   + ';' +
                     'User ID = '     + fUsername + ';' +
                     'Password = '    + fPassword + ';' +
                     fConnectParams, '''', -1)
  else
    ADOConnection.Open('Provider = '      + fProvider + ';' +
                     'Data Source = '     + fSource   + ';' +
                     'Initial Catalog = ' + fCatalog  + ';' +
                     'User ID = '         + fUsername + ';' +
                     'Password = '        + fPassword + ';' +
                     fConnectParams, '''',-1);
  InternalInitFieldDefs;
  if DefaultFields then CreateFields;
  BindFields(True);
  StartInfo := 0;
  StartCalc := StartInfo + SizeOf(TadoInfo);
  IsOpen := True;
  EMode:=True;
  DoMessage('Blobs='+IntToStr(BlobFieldCount))
end;


Durch Source.Active wird "TADODataSet.InternalOpen" aufgerufen. Der Fehler trat bei "ADOConnection.Open" auf. Ich hoffe jemand kann mir den entscheidenden Tipp geben.

Grüße von der Nordsee

Peter
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 03.03.14 16:16 
Hier findest du eine Anleitung für ADO für Delphi 4:
delphi.about.com/od/...base/l/aa121101a.htm
Vielleicht hilft dir das ja weiter. Da du schon ein TADODataSet nutzt, weiß ich nicht, warum es diesen Weg so als Anleitung gibt, aber ich vermute das hat einen Grund.
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Mi 05.03.14 15:42 
Hallo jaenicke,

danke für Deine Antwort. Leider hat es etwas gedauert, bis ich einen Schritt weiter gekommen bin.

Es hat sich gezeigt, dass viele unterschiedliche Variablennamen für Connectionstrings verwendet werden, die von der jeweiligen DLL abhängig sind. Typische Connectionstrings bei Microsoft haben da auch nicht weitergeholfen und die Fehlermeldung "[DBNETLIB][ConnectionOpen (ParseConnectParams()).]Ungültige Verbindung." ist in der Beziehung auch nicht sehr hilfreich. Man hat es da mit Bezeichnungen wie "Data Source" und "Database" oder "User Id" oder "UID" zu tun. Hier hilft nur die Suche bei der betreffenden DLL bei Microsoft.

Inzwischen erhalte ich diese Fehlermeldung nicht mehr. Doch wie kann es anders sein, soll doch nicht langweilig werden, erhalte ich eine andere: "[DBNETLIB][ConnectionOpen(Connect()).]SQL Server existiert nicht oder Zugriff verweigert".

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
  TForm1 = class(TForm)
    procedure FormShow(Sender: TObject);
  private
    { Private-Deklarationen}
  public
    { Public-Deklarationen}
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

uses ComObj; 

function adoConnect( connectionStr: string;
                     userName: string = '';
                     password: string = ''  ): oleVariant;
begin
  result := CreateOleObject('ADODB.Connection.2.8');        // ADODB.Connection

  if (VarType(result) = varDispatch) then
    if (userName <> ''then
      result.Open(connectionStr, userName, password)
    else
      result.Open(connectionStr);
end;
                                                                     
procedure TForm1.FormShow(Sender: TObject);
var
  fDB : oleVariant;
                                      
begin
  fDB := adoConnect( 'Provider=SQLOLEDB;'                                     +
                     'Database=O:\BUERO\Entwicklung\Test\Datenbank\Test.mdb;' +  
                     'Server=(local);'                                        +
                     'UID=User;'                                              +   
                     'PWD=;' )                                                 ;      

end;

end.

Der Zugriff soll auf MS Access 2002 erfolgen. Muß die Datenbank darauf vorbereitet werden oder verwende ich den falschen Treiber (SQL)? Ich hoffe jemand hat einen Tipp.

Grüße von der Nordsee

Peter
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 05.03.14 16:18 
Nimm besser die Jet-Engine:

ausblenden Delphi-Quelltext
1:
2:
3:
 AdoConn.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;' +
                              Data Source=' + Pfad + Datenbank +
                                 '
;Persist Security Info=False';
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Mi 05.03.14 17:47 
Hallo Perlsau,

danke für Deine Antwort. Leider klappt das nicht. Es gibt die Fehlermeldung "Installierbares ISAM nicht gefunden."

Grüße von der sonnigen Nordsee

Peter
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 05.03.14 17:55 
Nach dieser Fehlermeldung würde ich an deiner Stelle direkt mal googeln. Dann findest du z.B. das hier.
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Mi 05.03.14 20:21 
Hallo Perlsau,

nochmals Danke. Leider bringt Google und die Foren immer wieder die selben Artikel bei MS. Bei mir sínd anscheinend alle DLL korrekt unter win32 registriert, die Meldung kommt trotzdem.

Da kein Weg zum Ziel führt scheint mir die Ursache an ganz anderer Stelle zu liegen. Werd morgen meine Glück auf Assemblerebene versuchen. Vielleicht finde ich dort etwas.

Grüße von der Nordsee

Peter
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 05.03.14 20:32 
Wie wäre es, wenn du einmal mit dem Process Monitor schaust welche DLLs usw. so geladen werden? Vielleicht fällt dir ja dabei etwas auf.
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Do 06.03.14 16:43 
Hallo jaenicke,

Dank auch Dir. Die Forschungsergebnisse nach einigen Stunden im Eingenachten:
Die DLL's "MSJETOLEDB40.dll" und "msjet40.dll" werden geladen, wie die Modulanzeige versicherte. Dennnoch wird "DispatchInvokeError" aufgerufen und meldet den genannten Fehler. Es sieht so aus, als wenn doch noch Parameter im Connectionstring fehlen. Werde wohl noch weiter im "Eingenachten" wühlen müssen um es vielleicht herauszufinden, wenn sonst niemand einen heißen Tipp hat,

Grüße von der Nordsee

Peter
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Mo 17.03.14 13:14 
Ein freundliches Hallo an alle,

nachdem ich mich lange auf Assembler-Ebene herumgetrieben habe und einige Erkenntnisse über den Ablauf gewinnen konnte, habe ich dennoch keine konkreten Hinweise auf die Ursache der Fehlermeldung finden können. Der String wird vollständig ausgewertet und im Anschluß GlobalFlags geholt, was die aussagekräftige Fehlermeldung zur Folge hatte. Weitere Experimente mit dem Connectionstring brachten dann die Überraschung! :D

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
Var
  Excel    : String = 'Data Source=\\S_klibo_01\DATEN\...Demo_Adressen.xls'   ;
  AccessS  : String = 'Data Source=O:\...Test.mdb;'                           ;     
  AccessB  : String = 'Database=O:\BUERO\Entwicklung\Test\Datenbank\Test.mdb;';
  ProSQL   : String = 'Provider=SQLOLEDB;'                                    ;
  ProJet   : String = 'Provider=Microsoft.Jet.OLEDB.4.0;'                     ;    // <===
  UserIdP  : String = 'User Id=Peter;'                                        ;
  UserIdA  : String = 'User Id=admin;'                                        ;    // <===
  UIDP     : String = 'UID=Peter;'                                            ;
  UIDa     : String = 'UID=admin;'                                            ;
  UserA    : String = 'User=admin;'                                           ;
  Password : String = 'Password=;'                                            ;    // <===
  PWD      : String = 'PWD=;'                                                 ;


function adoConnect( connectionStr : string;
                     userName      : string = '';
                     password      : string = '' ): oleVariant;

begin
  result := CreateOleObject('ADODB.Connection');       
  if (VarType(result) = varDispatch) then
    if (userName <> ''then
      result.Open(connectionStr, userName, password)
    else
      result.Open(connectionStr);
end;

procedure TForm1.FormShow(Sender: TObject);
var
  fDB     : oleVariant;
                                      
begin
  fDB := adoConnect( ProJet    +
                     AccessS   +
                     UserIdA   +
                     Password
                   );
end;

(Die Pfade sind gekürzt.)

Damit kommt keine Fehlermeldung mehr. Werde versuchen auf Daten zuzugreifen und berichten.

Grüße von der Nordsee

Peter
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Mo 17.03.14 19:44 
Ein freundliches Hallo an alle,

einige Probleme mit denen ich es zu tun hatte, sind nun klar. Einige Schwierigkeiten mit dem Connection-String resultierten teilweise aus aus der Programmierung und nicht verhandener Kommentierung der gefundenen Routinen. So wurde in einem Fall der String zum Teil mit Parametern erstellt, doch wenn diese nicht gesetzt waren und statt dessen im String standen erschien eine Fehlermeldung. Im an den Treiber übergebenen String darf kein Fehler sein!

So bereinigt gelang es dann auch ein gefundenes "ADODataSet" zu einer Verbindung zu überreden. Doch leider gibt es nun neue Fragen, die ich nun auch in einer neuen Frage stellen werde.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
  if fProvider = '' then
    ADOConnection.Open( fConnectParams, '''', -1)
  else
    if fCatalog='' then
      ADOConnection.Open('Provider = '  + fProvider + ';' +
                       'Data Source = ' + fSource + ';' +
                       'User ID = '     + fUsername + ';' +
                       'Password = '    + fPassword + ';' +
                       fConnectParams, '''', -1)
    else
      ADOConnection.Open('Provider = ' + fProvider + ';' +
                       'Data Source = ' + fSource + ';' +
                       'Initial Catalog = ' + fCatalog + ';' +
                       'User ID = ' + fUsername + ';' +
                       'Password = ' + fPassword + ';' +
                       fConnectParams, '''',-1);

Grüße von der Nordsee

Peter