Случайно обнаружил, что тут есть русскоязычный форум, а я всё свой английский мучаю:
http://forums.devart.com/viewtopic.php?f=6&t=29501
Попробую изложить здесь ту же проблему.
Итак, пытаюсь перевести проект со старого SDAC 5 версии на самый "свежак" (6.10). Даже подписку уже обновил (Developer Number CRSDA-03066).
В проекте есть сервер приложений (COM+). На новом SDAC полезло множество глюков - клиентское приложение зависает, сервер в логи сыпет кучи сообщений об ошибках, среди которых "Communication link failure" - самое пристойное.
В отладчике Delphi исключение всегда возникает на открытии определённых наборов данных (TMSQuery.Open) но только не для простых запросов. По наблюдениям, ошибка возникает на больших запросах с использованием специфических инструкций T-SQL ("WITH - общие табличные выражения", OUTER\CROSS APPLY, большое количество соединений таблиц).
После целого дня мучений я всё-таки научился воспроизводить эту ситуацию!
Я использую Delphi XE и SQL Server 2005 SP4:
Код: Выделить всё
Microsoft SQL Server 2005 - 9.00.5292.00 (X64)
Apr 13 2011 15:43:31
Copyright (c) 1988-2005 Microsoft Corporation
Developer Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2)
Код: Выделить всё
CREATE TABLE [dbo].[SDAC_BUG](
ID SMALLINT NOT NULL,
ID_PARENT SMALLINT NOT NULL
CONSTRAINT [PK_SDAC_BUG] PRIMARY KEY (ID, ID_PARENT)
)
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
const
qTest =
'WITH TEST (ID) AS ( ' +
' SELECT A.ID FROM SDAC_BUG A ' +
' LEFT JOIN SDAC_BUG B ON 1 = 2 ' +
') ' +
'SELECT T.ID FROM SYS.OBJECTS GP ' +
'LEFT JOIN TEST T ON 1 = 2';
begin
MSConnection1.Open;
MSQuery1.SQL.Text := qTest;
MSQuery1.Open; // <--- Exception!
MSConnection1.Close;
end;
Любое небольшое изменение текста запроса может как изменить поведение процесса, так и исправить ошибку.
Например, если в последней строке запроса изменить "LEFT JOIN" на "FULL JOIN", то получаем ошибку: "Exception class EOLEDBError with message 'Соединение больше нельзя использовать, так как ответ сервера на выполнявшуюся ранее инструкцию имел неправильный формат.'".
А если там же использовать "INNER JOIN", то ошибки нет. Так же ошибка пропадает при изменении таблицы, например, достаточно из первичного ключа исключить один из столбцов.
Просьба не смотреть на "бредовость" тестового запроса. Я просто не могу понять, что же конкретно влияет на появление ошибки. Проблема очень похожа на изменение чужой памяти по невалидному указателю. Исправьте, пожалуйста.