Einzelnen Beitrag anzeigen

martin001

Registriert seit: 4. Nov 2017
10 Beiträge
 
#1

Fehler bei ADOConnection.Create als DLL

  Alt 6. Feb 2019, 18:25
Datenbank: sybase sql-anywhere • Version: 17.45 • Zugriff über: ODBC
Entwicklungsumgebung: RAD Studio 10.1 Berlin für 64 Bit + Eclipse (Java)

Hallo Zusammen,
ich stelle über eine DLL einen Datenbankzugriff einem Java-Programm zur Verfügung.
Bei dem Aufruf TADOConnection.create entsteht in der Java-Umgebung folgende Fehlermeldung:


Exception in thread "main" java.lang.Error: Invalid memory access
at com.sun.jna.Native.invokeInt(Native Method)
at com.sun.jna.Function.invoke(Function.java:390)
at com.sun.jna.Function.invoke(Function.java:323)
at com.sun.jna.Library$Handler.invoke(Library.java:23 6)
at com.sun.proxy.$Proxy0.GetNewEntries(Unknown Source)
at Movement.Verwaltung.getCollectionTasks(Verwaltung. java:708)
at Movement.Verwaltung.addScrollListViewtoRigthPanel( Verwaltung.java:292)
at Movement.Verwaltung.<init>(Verwaltung.java:111)
at Main.main(Main.java:6)

Wobei GetNewEntries eine der Proceduren ist, die durch die Delpph-DLL dem Java-Programm zur Verfügung gestellt wird, und die unten dargestellte Procedure AbfrageAusAPLTest aufruft.

1.) In der Testphase wurde kein Datenbankzugriff ausgeführt sondern nur fest hinterlegte Daten per DLL ausgetauscht. Das war fehlerfrei.
2.) Wenn ich die Procedure AbfrageAusAPLTest nicht über eine DLL exportiere, sondern von einem Delphiformular aufrufe, tritt auch mit der Datenbank kein Fehler auf.
3.) Wenn die Zeile "//showmessage('1. in AbfrageAusAPL: '+wherestring);[/I]" nach dem Begin der Procedure entkommentiert wird, tritt auch mit der DLL kein Fehler auf.
4.) Wenn ich die Zeile showmessage durch sleep ersetze, tritt der Fehler mit der DLL wieder auf.

Hat irgend jemand eine Idee wo das Problem liegt?
Eine unsaubere Lösung wäre auch das showmessage-Fenster kurz zu öffnen und nach 200 MS automatisch zu schließen. Weiß jemand wie das gehen könnte?



Delphi-Quellcode:
unit APLData2test;

interface

uses
  System.SysUtils, System.Classes,Data.Win.ADODB, dialogs,dek_sam;

type
  TDataModule2test = class(TDataModule)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
Procedure AbfrageAusAPLTest(WhereString:string; var AusAPL:DataAPLListe; var AbfrageOK:Boolean);

const
Nicht_ABG_DEL= ' and ((auftrag.nummer=kalkbeschreib.Kalknummer)' +
                        ' and (auftrag.status<>' + #39 + 'ABG' + #39 + ')' +
                        ' and (auftrag.status<>' + #39 + 'DEL' + #39 + ')' +
                        ' and ((kalkbeschreib.status=' + #39 + 'AUF' + #39 + ')' +
                                 ' or (kalkbeschreib.status=' + #39 + 'LIE' + #39 + ')))';


  { Connection string }
  ConnString =
  'Provider=MSDASQL.1;Password=apl;Persist Security Info=True;User ID=apl;Data Source=APLDB Client;Mode=ReadWrite';
    { User access }
  UserName = 'apl';PassWord = 'pass001';Server = 'APLDB Client';

var
  DataModule2test: TDataModule2test;

implementation

{%CLASSGROUP 'Vcl.Controls.TControl'}

{$R *.dfm}

Procedure AbfrageAusAPLTest(WhereString:string; var AusAPL:DataAPLListe; var AbfrageOK:Boolean);
// der übergebene Wherestring könnte z.B. lauten: WhereString:=' (Bogenname=' + #39 + Abfrage + #39 + ')';

var
  ADOConn : TADOConnection;
  ADOQuery : TADOQuery;
  //DataSrc : TDataSource;
  //Param : TParameter;

var SqlString,dummy:string;


begin
  //showmessage('1. in AbfrageAusAPL: '+wherestring);
  (* wenn diese showmessage hier steht, kommt keine Fehlermeldung!!*)
  { Create an ADO connection. }
  ADOConn := TADOConnection.Create(datamodule2test); //self
  { Set up the connection string. }
  ADOConn.ConnectionString := Format(ConnString,[UserName, PassWord, Server]);
  { Disable login prompt. }
  ADOConn.LoginPrompt := False;
  try
    ADOConn.Connected := True; showmessage('connected');
  except
    on e: EADOError do
    begin
      MessageDlg('Error while connecting', mtError,[mbOK], 0);
      Exit;
    end;
  end;
  { Create the query. }
  ADOQuery := TADOQuery.Create(DataModule2test); //self
  ADOQuery.Connection := ADOConn;
  { Update the parameter that was parsed from the SQL query: AnId. }
 // Param := ADOQuery.Parameters.ParamByName('AnId');
  //Param.DataType := ftInteger;
  //Param.Value := 1;

  { Set the query to Prepared--it will improve performance. }
  ADOQuery.Prepared := true;

  With Datamodule2test do
    begin
          Adoquery.Active:=false;
          //ADOQuery.Close;
          Adoquery.sql.Clear;
          sqlstring:= 'select bogenname,BestellDruckTermin,Farben_BG,BestellLieferTermin,fix,tdruck,twunsch,kalkbeschreib.nummer,' +
                      'f_check,fw_check,Sieb_check, ImDruck_check,Status_PT,auflage19,auflage18,auflage21,auflage20,auflage24,kalkbeschreib.objnummer,' +
                      'text,menge,auflage23,infofrei33,infofrei34,infofrei24,infofrei13,infofrei14,auflage22,besteller' +
                      ' from kalkbeschreib,auftrag where' + WhereString + Nicht_ABG_DEL;
          ADOQuery.sql.Add(sqlstring);
          If TestDB1 then showmessage('sqlstring: '+sqlstring);
            try
              ADOQuery.Active := True;
            except
              on e: EADOError do
              begin
                MessageDlg('Error while doing query', mtError,[mbOK], 0);
                Exit;
              end;
            end;
    end;
end;

end.

Geändert von martin001 ( 6. Feb 2019 um 18:30 Uhr)
  Mit Zitat antworten Zitat