Moin zusammen,
ich habe ein kleine Anwendung die jede Minute sich gegen eine
DB verbindet und schaut, ob eine Nachricht da ist.
Danach wird die Verbindung sofort wieder geschlossen.
Nun kann es sein das während des Select Befehls, die Verbindung unterbrochen wird und es kommt zu folgender Fehlermeldung. Siehe Anhang.
Dies ist meine derzeitige TADOConnection Einstellung:
Code:
TADOConnection - aktuelle Werte:
- CommandTimeout : 30
- ConnectOptions : coConnectUnspecified
- CursorLocation : clUseCLient
- IsolationLevel : ilCursorStability
- KeepConnection : True
- LoginPrompt : False
- Mode : cmRead
- Provider : SQLOLEDB.1
Hier mein Code für den Verbindungsaufbau und das Abfragen der Nachricht.
Delphi-Quellcode:
function Tfrm_main.ConnectToSQLServer : Boolean;
begin
Result := True;
frm_main.SQLConnection.Connected := False;
if IsHostAlive(dbserver) = False
then
begin
CreateLogFile('
SQL Server ' + dbserver + '
is unreachable. Try again later.',AppPath,0);
Result := False;
Exit;
end;
try
// SQL Authentifizierung
if dbinstance = '
'
then
SQLConnection.ConnectionString := '
Provider=SQLOLEDB.1;Data Source='+dbserver+'
;Initial Catalog='+
db+'
;User ID='+sqluser+'
;Password='+sqlpassword+'
;Persist Security Info=false'
else
SQLConnection.ConnectionString := '
Provider=SQLOLEDB.1;Data Source='+dbserver+'
\'+dbinstance+'
;Initial Catalog='+
db+'
;User ID='+sqluser+'
;Password='+sqlpassword+'
;Persist Security Info=false';
SQLConnection.Connected := True;
except
on e:
Exception do
begin
CreateLogFile('
Database Connection has been terminated with an unexpected error - ' + e.
Message,AppPath,0);
Result := False;
SQLConnection.Connected := False;
Exit;
end;
end;
if SQLConnection.Connected = False
then
begin
CreateLogFile('
Database Connection failed. Please contact your local Administrator',AppPath,0);
Result := False;
Exit;
end;
end;
...
procedure Tfrm_main.Timer_EventCheckTimer(Sender: TObject);
begin
...
if ConnectToSQLServer = True
then // Datenbankverbindung herstellen
begin
DSData.Close;
DSData.CommandText := '
Select * from computer_broadcast where (id = 1) and ' +
'
(('+AppLocation+'
= 1) or '+
// 1 = True
'
(computer = ' + QuotedStr(GetEnvironmentVariable('
COMPUTERNAME')) + '
))';
DSData.Open;
if DSData.RecordCount > 0
then
begin
// Check, ob das Event schon mal gezeigt wurde
if lastevent < DSData.FieldByName('
createdon').AsDateTime
then
begin
lastevent := DSData.FieldByName('
createdon').AsDateTime;
// fürs nächste Mal
lbl_datetime.Caption := FormatDateTime('
dd.mm.yyyy hh:nn:ss',lastevent);
redt_infobox.Text := DSData.FieldByName('
memo').AsString;
Application.MainForm.Visible := True;
end;
end;
DSData.Close;
SQLConnection.Connected := False;
end
else
begin
SQLConnection.Connected := False;
CreateLogFile('
SQL Connection to ' + dbserver + '
\'+ dbinstance + '
with Database ' +
db + '
and UserName ' + sqluser + '
failed',AppPath,0);
Sleep(300000);
// 5 Minuten
end;
...
end;
Vielen Dank im Voraus.
Sven