Hallo nochmals. Haben das Problem jetzt mit Stored Procedures gelöst und die sind in der Tat wunderbar schnell, so dass ich nun mit der Geschwindigkeit meines Programms sehr zufrieden bin.
Problem: Ich habe das Abrufen der E-Mails in einem Thread ausgelagert. Innerhalb des Threads wird daher auch die folgende Funktion(s.u.)aufgerufen, die die Datenbank abfragen muss. Es kommt an der Stelle "IsEMailInDBQuery.Transaction:=ta;" zur AccessViolation - aber erst beim zweiten Aufrufen der Funktion.
Zusätzliche Informationen:
- Das Problem taucht nur auf, wenn das Programm mit einer DelphiXE2 Version innerhalb einer VirtualBox gedebugt wird.
- Das Object TDatabaseConnection befindet sich nicht innerhalb des Threads. Ich habe die Funktion IsEMailInDB daher testweise per Synchronize aufgerufen, was aber nichts an der
AV ändert.
Delphi-Quellcode:
function TDataBaseConnection.IsEMailInDB_All(aEmailList:EMailList):IsEMailInDB_result;
var i:integer;
str:
string;
ta: TIBTransaction;
begin
ta:=TIBTransaction.Create(
nil);
ta.DefaultDatabase:=
DB;
if not assigned(IsEMailInDBQuery)
then
begin
IsEMailInDBQuery:=TIBQuery.Create(
nil);
IsEMailInDBQuery.Database:=
DB;
IsEMailInDBQuery.SQL.Text := '
SELECT * FROM IS_EMAIL_IN_DB(:STR)';
IsEmailINDBQuery.Prepare;
end;
IsEMailInDBQuery.Transaction:=ta;
str:='
';
for i := 0
to length(aEMailList)-1
do
str:=str+inttostr(aEMailList[i].customerid)+'
,'+datetimetostr(aEMailList[i].EmailDate)+'
,';
str:=copy(str,1,length(str)-1);
IsEMailInDBQuery.Params[0].AsString:=str;
IsEMailInDBQuery.open;
str := IsEMailinDBQuery.Fields[0].AsString;
setlength(result,length(str));
for i := 0
to length(str)-1
do
result[i]:=(str[i+1]<>'
0');
IsEMailInDBQuery.Close;
ta.free;
end;
Hat jemand eine Idee?