Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

D7.ADO.MSSQL:Разрушительный сбой при выполнении запроса

65 views
Skip to first unread message

Dmytry Ginzburg

unread,
Nov 7, 2008, 2:41:54 PM11/7/08
to
Здравствуйте, о моногоуважаемый(ая), All!
Вот.. Hабил письмецо.. А вот, что из этого вышло:
Привет всем! Пишу сервис, который работает с базой данных MS SQL и осуществляет
обмен между ней и удалённым DCOM сервером. Использую стандартный объект
TService. Поскольку он создаётся в главном потоке, а сервис функционирует в
своём, то чтобы не было проблем создаю ADOQuery в потоке сервиса. Всё делаю
следующим образом
_!--==> А тута Windows Clipboard начинается... <==--!_
const ConnectionStr='Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist
Security In' +
'fo=False;Initial Catalog=kpa;Data Source=.\SQLEXPRESS;Use Proced' +
'ure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encry' +
'ption for Data=False;Tag with column collation when possible=Fal' +
'se';
var ADOQuery:TADOQuery;
......
_!--==> А тута Windows Clipboard заканчивается... <==--!_

_!--==> А тута Windows Clipboard начинается... <==--!_
procedure TOPCService.ServiceStart(Sender: TService; var Started: Boolean);
var Browser:OPCBrowser;
i,j,l,n,k:integer;
s,s1:string;
begin
Init:=CoInitialize(Nil);
if(Init<>S_OK)and(Init<>S_FALSE)then
begin
LogMessage('Служба не запущена по причине сбоя при инициализации COM. Код
ошибки '+IntToHex(Init,8),EVENTLOG_ERROR_TYPE,0,1);
Started:=false;
end;
if(Init=S_OK)or(Init=S_FALSE)then
try
....
ADOQuery=TADOQuery.Create(nil);
ADOQuery.ConnectionString:=ConnectionStr;
.....

except
on E:Exception do
begin
Started:=false;
....
if ADOQuery<>nil then ADOQuery.Free;
ADOQuery:=nil;
if(Init=S_OK)or(Init=S_FALSE)then CoUninitialize;
LogMessage('Ошибка. '+E.Message,EVENTLOG_ERROR_TYPE,0,1);
end;
end;
_!--==> А тута Windows Clipboard заканчивается... <==--!_
В обработчике события OnStop и OnShutdown соответственно всё за собой подчищаю.
В обработчике события OnExecute вызываю один из написанных мной методов
_!--==> А тута Windows Clipboard начинается... <==--!_
procedure TOPCService.WriteIBSDataToOPC;
var i:integer;
begin
try
OutputDebugString('Попытка начать запись в OPC-сервер');
ADOQuery.Close;
ADOQuery.SQL.Clear;
ADOQuery.SQL.Add('Select count(*) from work_time where stop_time is null');
OutputDebugStringW(PWideChar('Строка подключения к БД
'+ADOQuery.ConnectionString));
ADOQuery.Open;
OutputDebugString(PChar('Количество записей
'+ADOQuery.Fields.Fields[0].AsString));
.....
except
on E:Exception do
begin
OutputDebugString(PChar('Ошибка. '+E.Message));
LogMessage('Ошибка. '+E.Message,EVENTLOG_ERROR_TYPE,0,1);
end;
end;
_!--==> А тута Windows Clipboard заканчивается... <==--!_
Всё, что пишу функцией OutputDebugString просматриваю программой DebugView. И
обнаружил такой момент. При первом же выполнении запроса в логах вижу
исключение "Разрушительный сбой". Остальные запросы тоже не выполняются с такой
же ошибкой. Таблица work_time существует, поле stop_time в ней есть логин, под
которым работает сервис, имеет права на выборку. Кто что может предложить по
решению данной проблемы? MSSQL 2005 Express, сервис запусал под Win2000 и
WinXP.
Желаю Вам всего наилучшего, All.Дмитрий.

0 new messages