Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Mit ADO ODBC auf AS400 zugreifen (https://www.delphipraxis.net/151464-mit-ado-odbc-auf-as400-zugreifen.html)

alf.stefan 19. Mai 2010 06:56

Datenbank: Acess • Zugriff über: ADO

Mit ADO ODBC auf AS400 zugreifen
 
Hallo zusammen,

ich habe das Problem, dass ich auf eine Datenbank zugreifen soll, das geht aber nicht!

Durch das ADO Tutorial habe ich die Verbindung hinbekommen, das Funktioniert auch und ich kann über ADOConnection
auch die FeldNamen des Tables lesen von dem ich die Daten will!

Aber ob ich ADOQuery, ADOTable oder ADODataSet verwende es kommt immer die gleiche Fehlermeldung

Zitat:

[IBM]iSeries Access ODBC-Treiber][DB2 UDB]SQL0204 - WAKO der Art *FILE in myUser nicht gefunden
Wobei WAKO der Table ist und myUser der User (??) der sich mit Passwort connected!
Kann sich da jemand einen Reim drauf machen?

Wenn ich im ObejktInspektor CommandText anklicke kommt auch ein Auswahlfenster in dem ich die Tabelle (Table) und die Felder der SQL Abfrage eingeben muss/kann. Es besteht also eine Verbindung!

Wie komme ich bloss an die Daten?


Ihr merkt ich habe keine Ahnung, hoffentlich kann mir geholfen werden :)

Gruß

Stefan


Hier ist mal mein Code!
Delphi-Quellcode:
unit uDb2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Button2: TButton;
    ADOConnection1: TADOConnection;
    Memo1: TMemo;
    Label2: TLabel;
    Button3: TButton;
    ADODataSet1: TADODataSet;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button3Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  myWako : TADOTable;
const
  user : string = 'myUser';
  passWord : string = 'myPassword';

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
      ADOConnection1.ConnectionString :=
      'Provider=MSDASQL;'
      +'Persist Security Info=False;'
      +'User ID='+user+';'
      +'Password='+passWord+';'
      +'Data Source=rhdbd_16;'
       +'EXTCOLINFO=1;'
       +'Driver=iSeries Access ODBC Driver;'
      +'Initial Catalog=VWWE400;'
      +'DBQ=C:\Programme\Borland\Delphi7\Projects\DB\AS400.mdb;'
      +'Mode=Read;';
      Memo1.Lines.Append(ADOConnection1.ConnectionString);

end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    if assigned(myWako) then
    begin
      myWako.Active := False;
      myWako.Free;
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin

       if ADOConnection1.Connected then ADOConnection1.Close
       else ADOConnection1.Open(user,passWord);
       if ADOConnection1.Connected then Button1.Caption := 'DisConnect'
       else Button1.Caption := 'Connect';

end;

procedure TForm1.Button2Click(Sender: TObject);
var
  fieldNames: TStrings;
begin
        memo1.Clear;

        fieldNames := TStringList.Create;

        ADOConnection1.GetFieldNames('WAKO', fieldNames);
        Label1.Caption := intToStr(fieldNames.Count)+' tFields in WAKO available';
        Memo1.Lines.Clear;
        Memo1.Lines.AddStrings(fieldNames);


        fieldNames.Free;

end;



procedure TForm1.Button3Click(Sender: TObject);
var
  indexList: TStrings;
begin

       indexList := TStringList.Create;
       ADODataSet1.GetIndexNames(indexList);
       memo1.Lines.AddStrings(indexList);
       indexList.Free;

end;

end.

alzaimar 19. Mai 2010 09:44

Re: Mit ADO ODBC auf AS400 zugreifen
 
Ich sehe im Code nicht, das Du myWako instantiierst oder verwendest. Wo ist genau das Problem?

Gollum 19. Mai 2010 10:39

Re: Mit ADO ODBC auf AS400 zugreifen
 
Hallo,
was mir seltsam vorkommt ist Dein Connection-String. Was hat da eine Access-DB darin zu suchen, wenn Du auf eine AS400 zugreifen willst?
Ich benutze schon seit Jahren folgenden Connectionstring zum Auslesen von Daten:
Delphi-Quellcode:
const
  sVerbindIP=
    'DRIVER=Client Access ODBC Driver (32-bit);'+
    'SYSTEM=%s;'+
    'DefaultLibraries=%s;'+
    'UserID=%s;'+
    'PASSWORD=%s;';

function MakeConStrODBC_400(const aIP, aLibrarie, aUser, aPass:String):String;
begin
  Result:=Format(sVerbindIP, [aIP, aLibrarie, aUser, aPass]);
end; // MakeConStrODBC_400

....

function TForm1.ConnectToDB():Bool;
var IPZurAS400:String;
begin
  //IPZurAS400:='127.0.0.1'; --> diesen Wert enstsprechend anpassen
  Result:=True;
  if AdoConnection1.Connected then AdoConnection1.Connected:=False;
  AdoConnection1.ConnectionString:=MakeConStrODBC_400(IPZurAS400, 'VWWE400', myUser, myPassword);
  try
    AdoConnection1.Connected:=True;
  except
    on E: Exception do
    begin
      MessageDlg(E.Message, mtError, [mbOk], 0);
      Result:=False;
    end; // on
  end; // try
end; // TForm1.ConnectToDB

p80286 19. Mai 2010 11:45

Re: Mit ADO ODBC auf AS400 zugreifen
 
Wie schon von meinen Vorschreibern bemerkt:
AS400 und Access haben recht wenig miteinander zu tun. Falls die AS400 als Fileserver agieren sollte ist das eigentlich unerheblich.

Falls der Zugriff über ODBC erfolgen sollte, ist mit der Einrichtúng des ODBC-Treibers eigentlich alle Arbeit getan.
Man übergibt DSN, Passwort und User (falls überhaupt notwendig) und dann geht's los.

Daß die ODBC-Treiber manchmal recht eigenwillig sind, steht auf einem anderen Blatt.

Wieso wird eigentlich nicht der MS-Treiber genutzt? Die sollten Access eigentlich am besten kennen!

Gruß
K-H

Edith: tippfehler

alf.stefan 19. Mai 2010 13:15

Re: Mit ADO ODBC auf AS400 zugreifen
 
Danke für die Antworten!

Der entscheidende Durchbruch kam aber aus einem andren Forum: "NewSolutions für iSeries und AS/400"
ich bekam dort gesagt:
Zitat:

Wie immer das selbe Problem:
Wenn ich unqualifizierte Abfragen mache, wird die Table in der Lib des angemeldeten Users gesucht.
Möchte ich eine bestimmte tabelle abfragen muss ich den namen qualifizieren:

select * from mylib.mytable ...

@alzaimar: das myWako ist noch ein überbleisel meiner rumprobiererei

@Gollum: der Access.mdb eintrag entstand auch nur aus lauter verzweiflung und hat seinen Ursprung in dem VisualBasic Program das im Moment die DatenBank Anbindung macht. Mein Connection String OHNE die DBQ=...AS400.mdb funktioniert auf jeden Fall, jetzt.

Also Danke nochmals, und ciao!

Sir Rufo 19. Mai 2010 14:16

Re: Mit ADO ODBC auf AS400 zugreifen
 
Ich weiß ja nicht welche Client Access Version du einsetzt, aber es gibt dort bei den neueren auch OLE-Treiber
Code:
Provider=IBMDA400.DataSource.1;Persist Security Info=False;Data Source=AS400.Name;Default Collection=mylib
Das "Default Collection" sorgt dafür, dass ein unqualifizierter Tabellen-Name in der dort angegebenen Bibliothek gesucht wird.

Gaaaaaaaaaaaanz wichtig: Immer das aktuelleste SP vom Client Access installieren!


Alle Zeitangaben in WEZ +1. Es ist jetzt 17: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