Получение Delphi 7 для игры с SQL Server Compact 3.5

У нас есть старое приложение, написанное на Delphi 7. В настоящее время оно подключено к старой базе данных Oracle Lite, которая удаляется. Полномочия, которые были выбраны для перемещения данных в базу данных Microsoft SQL Server Compact. После того, как я потратил много времени на перенос данных в базу данных SQL CE, мне поручили заставить приложение Delphi хорошо работать с новыми базами данных.

Люди, которые должны быть умнее меня (мой босс), говорят мне, что я должен иметь возможность просто изменить соединение, и все должно вернуться в порядок. Тем не менее, я два дня бился головой о монитор, пытаясь настроить соединение ADO в приложении Delphi для работы с нашей новой базой данных SQL CE.

Немного упрощенный пример того, с чем я работаю:

Соединение выполняется в глобальном объекте с TADOConnection с именем "adoConn":

procedure TGlobal.DataModuleCreate(Sender: TObject);
begin
    adoConn.ConnectionString := 'Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;Data Source=path\db.sdf;';
    adoConn.Connected := True;
end;

Вскоре после этого вызывается процедура для заполнения некоторых сообщений. Стремясь решить проблему с приложением, я упростил код, чтобы сделать простой запрос и показать результаты в окне сообщения. Процедура получает параметр для строки SQL, но я пока игнорирую его и вручную вставляю простой оператор выбора:

procedure Select(const SQL: string);
var
    adoQuery : TADOQuery;
begin
    adoQuery := TADOQuery.Create(nil);
    try
        adoQuery.Connection := Global.adoConn;
        adoQuery.SQL.Text := 'select * from CLT_MESSAGES';
        adoQuery.ExecSQL;
        While not adoQuery.Eof do
        begin
            // Here I just created a MessageDlg to output a couple of fields.
            adoQuery.Next;
        end;
    finally
        adoQuery.Free;
    end;
end;

Все компилируется просто отлично, но когда я запускаю приложение, я получаю следующую ошибку:

"Многошаговая операция вызвала ошибки. Проверьте каждое значение состояния".

Я сделал несколько дополнительных устранения неполадок и обнаружил, что ошибка происходит в adoQuery.ExecSQL. Я пробовал несколько разных версий строки подключения и несколько разных способов запроса данных, но все заканчивается одинаково. Я либо не могу подключиться к базе данных, либо получаю эту глупую ошибку "Mutliple-step".

Я заранее ценю любую помощь, которая может быть предложена.

2 ответа

Решение

Не использовать ExecSQL для запросов, которые возвращают наборы записей.

Установите либо AdoQuery.Active собственность на True или использовать AdoQuery.Open выполнить SELECT заявление.

ОБНОВИТЬ

После изменения вашего кода мы видим настоящую ошибку DB_E_OBJECTOPEN.

UPDATE2

После более глубокого изучения кажется, что это известная ошибка в поставщике OLE DB и в полях nvarchar длиной более 127 символов.

эти ссылки, кажется, подтверждают это:

SO: SQL Server Compact Edition 3.5 выдает ошибку "Многоэтапная операция выдает ошибки" для простого запроса

ref1: http://www.tech-archive.net/Archive/SQL-Server/microsoft.public.sqlserver.ce/2008-07/msg00019.html

ref2: https://forums.embarcadero.com/thread.jspa?messageID=474517

ref3: http://social.msdn.microsoft.com/Forums/en-US/sqlce/thread/48815888-d4ee-42dd-b712-2168639e973c

Изменение типа курсора на стороне сервера решило для меня проблему с 127 символами:)

Другие вопросы по тегам