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.