powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Другие СУБД [игнор отключен] [закрыт для гостей] / Линтер, зависание запроса в ADO
12 сообщений из 12, страница 1 из 1
Линтер, зависание запроса в ADO
    #36372158
dr.Offspring
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
После создания таблицы и занесения в неё одной записи, при выполнении запроса происходит зависание. Загрузка процессора 100% из них 10% наше приложение, остальное делят процессы dbc_wnt.exe, linternt.exe.
Линтер Стандарт 6.0.14. Подключение через ADO OLEDB Provider – LinOleDB. Библиотека linoledb.dll пропатченная от предыдущих ошибок. Запрос выполняется с клиентским курсором, однонаправленным (adOpenForwardOnly), только на чтение (adLockReadOnly). Причем, выполнение того же запроса из рабочего стола ЛИНТЕР выполняется нормально.
Метаданные:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
CREATE TABLE "User" (
"DocID" INTEGER NOT NULL,
"ExtID" VARCHAR( 14 ) NOT NULL DEFAULT '',
"Deleted" INTEGER NOT NULL DEFAULT  0 ,
"ModifyDate" DATE NOT NULL DEFAULT '30.12.1899:00:00:00',
"GroupDoc" INTEGER NOT NULL DEFAULT  0 ,
"isGroup" INTEGER NOT NULL DEFAULT  0 ,
"CreateDate" DATE NOT NULL DEFAULT '30.12.1899:00:00:00',
"CreateUser" VARCHAR( 40 ) NOT NULL DEFAULT '',
"UpdateDate" DATE NOT NULL DEFAULT '30.12.1899:00:00:00',
"UpdateUser" VARCHAR( 40 ) NOT NULL DEFAULT '',
"CreateCode" VARCHAR( 10 ) NOT NULL DEFAULT '',
"GroupPath" VARCHAR( 850 ) NOT NULL DEFAULT '',
"Version" INTEGER NOT NULL DEFAULT  0 ,
"Name" VARCHAR( 850 ) NOT NULL DEFAULT '',
"SID" VARCHAR( 250 ) NOT NULL DEFAULT '',
"FullName" VARCHAR( 250 ) NOT NULL DEFAULT '',
"Description" VARCHAR( 250 ) NOT NULL DEFAULT '',
"FullAccess" SMALLINT NOT NULL DEFAULT  0 ,
"Disabled" SMALLINT NOT NULL DEFAULT  0 ,
"КодФилиала" VARCHAR( 250 ) NOT NULL DEFAULT '',
"УровеньКонфиденциальности" INTEGER NOT NULL DEFAULT  0 ,
"ЭлементСБ" SMALLINT NOT NULL DEFAULT  0 ,
"ЗамокЭлементаСБ" SMALLINT NOT NULL DEFAULT  0 ,
"КодПодсистемы" INTEGER NOT NULL DEFAULT  0 ,
"КодМодуля" VARCHAR( 250 ) NOT NULL DEFAULT '',
"КодУчастника" INTEGER NOT NULL DEFAULT  0 ,
"НапоминанияВыключены" SMALLINT NOT NULL DEFAULT  0 ,
"ВариантЗапускаСессии" INTEGER NOT NULL DEFAULT  0 ,
"ПанельУправления" INTEGER NOT NULL DEFAULT  0 ,
"ИнтерфейснаяПанель" INTEGER NOT NULL DEFAULT  0 ,
"ИнтерфейснаяСхема" INTEGER NOT NULL DEFAULT  0 ,
"КлассКартотеки" VARCHAR( 250 ) NOT NULL DEFAULT '',
"КлассБланка" VARCHAR( 250 ) NOT NULL DEFAULT '',
"ПерекрытьВышестоящиеНастр" SMALLINT NOT NULL DEFAULT  0 ,
"ВходитьПодВсеПредприятия" SMALLINT NOT NULL DEFAULT  0 ,
"Субъект" INTEGER NOT NULL DEFAULT  0 ,
"Подразделение" INTEGER NOT NULL DEFAULT  0 ,
"ВидПлатежа" VARCHAR( 250 ) NOT NULL DEFAULT '',
"РаботатьБезВыбораПредприя" SMALLINT NOT NULL DEFAULT  0 ,
"МаксимальнаяВажность" INTEGER NOT NULL DEFAULT  0 ,
"ТипичнаяВажность" INTEGER NOT NULL DEFAULT  0 ,
"СрокРезервирования" INTEGER NOT NULL DEFAULT  0 ,
"ТипЦеныПоУмолчанию" INTEGER NOT NULL DEFAULT  0 ,
"ПокупательПоУмолчанию" INTEGER NOT NULL DEFAULT  0 ,
"СкладПоУмолчанию" INTEGER NOT NULL DEFAULT  0 ,
"СотрудникПоУмолчанию" INTEGER NOT NULL DEFAULT  0 ,
"ВалютаДокументаПоУмолчани" INTEGER NOT NULL DEFAULT  0 ,
"МетодРазбросаСуммыОплаты" INTEGER NOT NULL DEFAULT  0 ,
"НДСВключенВЦену" SMALLINT NOT NULL DEFAULT  0 ,
"СтатусПоУмолчанию" SMALLINT NOT NULL DEFAULT  0 ,
"ЕдиницаИзмерения" INTEGER NOT NULL DEFAULT  0 ,
"Страна" INTEGER NOT NULL DEFAULT  0 ,
"СтавкаНДСПоУмолчанию" VARCHAR( 250 ) NOT NULL DEFAULT '',
"ТипРесурсаПоУмолчанию" INTEGER NOT NULL DEFAULT  0 ,
"УстанавливатьЛимитКредита" SMALLINT NOT NULL DEFAULT  0 ,
"СуммаЛимитаКредита" DOUBLE NOT NULL DEFAULT  0 ,
"ВалютаЛимитаКредита" INTEGER NOT NULL DEFAULT  0 ,
"УстанавливатьСрокВозврата" SMALLINT NOT NULL DEFAULT  0 ,
"СрокКредита" INTEGER NOT NULL DEFAULT  0 , 
PRIMARY KEY("DocID"))

CREATE INDEX "i_GroupDoc" ON "User" ("GroupDoc")
CREATE INDEX "i_GroupPath" ON "User" ("GroupPath")
ALTER TABLE "User" ADD UNIQUE ("Name","Deleted")
ALTER TABLE "User" ADD UNIQUE ("ExtID")
Данные:
Код: plaintext
1.
INSERT INTO "User" ("DocID", "ExtID", "Deleted", "ModifyDate", "GroupDoc", "isGroup", "Name", "FullName", "Description") VALUES ( 1 , '5O9B8J2G8MEQO1',  0 , '17.12.2009:16:21:30',  0 ,  0 , 'Администратор', '', '')
Запрос с зависанием:
Код: plaintext
1.
2.
3.
4.
SELECT  "A1"."DocID","A1"."ExtID","A1"."Deleted","A1"."ModifyDate","A1"."GroupDoc","A1"."isGroup","A1"."CreateDate","A1"."CreateUser","A1"."UpdateDate","A1"."UpdateUser","A1"."CreateCode","A1"."GroupPath","A1"."Version","A1"."Name","A1"."SID","A1"."FullName","A1"."Description","A1"."FullAccess","A1"."Disabled","A1"."КодФилиала","A1"."УровеньКонфиденциальности","A1"."ЭлементСБ","A1"."ЗамокЭлементаСБ","A1"."КодПодсистемы","A1"."КодМодуля","A1"."КодУчастника","A1"."НапоминанияВыключены","A1"."ВариантЗапускаСессии","A1"."ПанельУправления","A1"."ИнтерфейснаяПанель","A1"."ИнтерфейснаяСхема","A1"."КлассКартотеки","A1"."КлассБланка","A1"."ПерекрытьВышестоящиеНастр","A1"."ВходитьПодВсеПредприятия","A1"."Субъект","A1"."Подразделение","A1"."ВидПлатежа","A1"."РаботатьБезВыбораПредприя","A1"."МаксимальнаяВажность","A1"."ТипичнаяВажность","A1"."СрокРезервирования","A1"."ТипЦеныПоУмолчанию","A1"."ПокупательПоУмолчанию","A1"."СкладПоУмолчанию","A1"."СотрудникПоУмолчанию","A1"."ВалютаДокументаПоУмолчани","A1"."МетодРазбросаСуммыОплаты","A1"."НДСВключенВЦену","A1"."СтатусПоУмолчанию","A1"."ЕдиницаИзмерения","A1"."Страна","A1"."СтавкаНДСПоУмолчанию","A1"."ТипРесурсаПоУмолчанию","A1"."УстанавливатьЛимитКредита","A1"."СуммаЛимитаКредита","A1"."ВалютаЛимитаКредита","A1"."УстанавливатьСрокВозврата","A1"."СрокКредита" 
FROM "User" A1 
WHERE "A1"."DocID" = 1  
ORDER BY "A1"."DocID"
Запросы, которые отрабатывают нормально:
Код: plaintext
1.
2.
3.
4.
SELECT  COUNT("A1"."DocID") FROM "User" A1
SELECT  "A1"."Name","A1"."DocID","A1"."ExtID","A1"."Deleted","A1"."GroupDoc","A1"."isGroup","A1"."GroupPath" 
FROM "User" A1 
ORDER BY "A1"."Name","A1"."Deleted"
...
Рейтинг: 0 / 0
Линтер, зависание запроса в ADO
    #36372419
dr.Offspring
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В случае выполнения этого запроса с серверным курсором, зависание происходит после открытия при обращении к методу Get_EOF ADO-объекта Recordset.
...
Рейтинг: 0 / 0
Линтер, зависание запроса в ADO
    #36380001
xuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Действительно, была такая проблема. Исправленный модуль выслан Вам на E-mail,
указанный в контактной информации на этом форуме.
...
Рейтинг: 0 / 0
Линтер, зависание запроса в ADO
    #36385046
dr.Offspring
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xuser,

Получил и установил новый модуль.
Теперь на том же запросе на методе RecordSet.Open ошибка:
Код: plaintext
1.
2.
MainThread, EOleException: Неопознанная ошибка
Add Info ID=0294906C, Messages:  1 : Number= 80004005 , Source=Linter OLE DB Provider, SQLState=, Description=Неопознанная ошибка
Код: plaintext
1.
2.
SELECT Count(*) FROM "User"
 0 
Вот код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
{ Служебные функции }
  function CreateADOObject(const ClassID: TGUID): IUnknown;
  var
    Status: HResult;
    FPUControlWord: Word;
  begin
    {! 64 }
    asm
      FNSTCW  FPUControlWord
    end;
    Status := CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, IUnknown, Result);
    asm
      FNCLEX
      FLDCW FPUControlWord
    end;
    if Status = REGDB_E_CLASSNOTREG then
      raise Exception.CreateRes(@SADOCreateError)
    else
      OleCheck(Status);
  end;


{ Собственно создание и открытие запроса }
    FRecordset := CreateADOObject(CLASS_Recordset) as _Recordset;
    FRecordset.CursorLocation := adUseClient;

    vCommand := CreateADOObject(CLASS_Command) as _Command;
    vCommand.CommandType := adCmdText;
    vCommand.CommandTimeout := FTimeout;
    vCommand.CommandText := FSQLText
    vCommand.Set_ActiveConnection( FOwner.FConnection );
   { Падает на следующей строчке }
    FRecordset.Open(vCommand, EmptyParam, adOpenForwardOnly, adLockReadOnly, adCmdText);

    while FRecordset.State = adStateClosed do
      try
        FRecordset := FRecordset.NextRecordset(vRecAffected);
        if FRecordset = nil then
          Abort;
      except
        DatabaseError(SNoResultSet, nil);
      end;
...
Рейтинг: 0 / 0
Линтер, зависание запроса в ADO
    #36385067
dr.Offspring
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
После вставки записи:
Код: plaintext
INSERT INTO "User" ("DocID", "ExtID", "Deleted", "ModifyDate", "GroupDoc", "isGroup", "Name", "FullName", "Description") VALUES ( 1 , '5O9B8J2HMG9D0B',  0 , '24.12.2009:15:08:14',  0 ,  0 , 'Администратор', '', '')
Выполнение запроса приводит к той же ошибке...
...
Рейтинг: 0 / 0
Линтер, зависание запроса в ADO
    #36387419
xuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

С этим вопросом пока разбираемся.
Проблему у провайдера LinOleDB вызвал следующий код:

vCommand := CreateADOObject(CLASS_Command) as _Command;
vCommand.CommandType := adCmdText;
vCommand.CommandTimeout := FTimeout;
vCommand.CommandText := FSQLText
vCommand.Set_ActiveConnection( FOwner.FConnection );
{ Падает на следующей строчке }
FRecordset.Open(vCommand, EmptyParam, adOpenForwardOnly, adLockReadOnly, adCmdText);

Мы в основном работаем (и проверяем примеры), используя Microsoft Visual Studio, а не Delphi.
Там прототип для функции Recordset::Open выглядит так :

HRESULT Recordset15::Open ( const _variant_t & Source, const _variant_t & ActiveConnection, enum CursorTypeEnum CursorType, enum LockTypeEnum LockType, long Options )

В первом аргументе передаём не объект _Command, а собственно текст запроса.
В таком варианте метод Open у нас отрабатывает без ошибок (код, для краткости
и наглядности, приведён без проверок возвращаемых значений):

_ConnectionPtr pConnection = NULL;
_RecordsetPtr pRst = NULL;
HRESULT hr;
_variant_t vttarray, result;
long cFields, lUbound = 0, rgIndices[2], lRecords, lFields;
TCHAR *tszQuery = _T("SELECT \"A1\".\"DocID\",\"A1\".\"ExtID\",\"A1\".\"Deleted\",\"A1\".\"ModifyDate\",\"A1\".\"GroupDoc\",\"A1\".\"isGroup\",\"A1\".\"CreateDate\",\"A1\".\"CreateUser\",\"A1\".\"UpdateDate\",\"A1\".\"UpdateUser\",\"A1\".\"CreateCode\",\"A1\".\"GroupPath\",\"A1\".\"Version\",\"A1\".\"Name\",\"A1\".\"SID\",\"A1\".\"FullName\",\"A1\".\"Description\",\"A1\".\"FullAccess\",\"A1\".\"Disabled\",\"A1\".\"КодФилиала\",\"A1\".\"УровеньКонфиденциальности\",\"A1\".\"ЭлементСБ\",\"A1\".\"ЗамокЭлементаСБ\",\"A1\".\"КодПодсистемы\",\"A1\".\"КодМодуля\",\"A1\".\"КодУчастника\",\"A1\".\"НапоминанияВыключены\",\"A1\".\"ВариантЗапускаСессии\",\"A1\".\"ПанельУправления\",\"A1\".\"ИнтерфейснаяПанель\",\"A1\".\"ИнтерфейснаяСхема\",\"A1\".\"КлассКартотеки\",\"A1\".\"КлассБланка\",\"A1\".\"ПерекрытьВышестоящиеНастр\",\"A1\".\"ВходитьПодВсеПредприятия\",\"A1\".\"Субъект\",\"A1\".\"Подразделение\",\"A1\".\"ВидПлатежа\",\"A1\".\"РаботатьБезВыбораПредприя\",\"A1\".\"МаксимальнаяВажность\",\"A1\".\"ТипичнаяВажность\",\"A1\".\"СрокРезервирования\",\"A1\".\"ТипЦеныПоУмолчанию\",\"A1\".\"ПокупательПоУмолчанию\",\"A1\".\"СкладПоУмолчанию\",\"A1\".\"СотрудникПоУмолчанию\",\"A1\".\"ВалютаДокументаПоУмолчани\",\"A1\".\"МетодРазбросаСуммыОплаты\",\"A1\".\"НДСВключенВЦену\",\"A1\".\"СтатусПоУмолчанию\",\"A1\".\"ЕдиницаИзмерения\",\"A1\".\"Страна\",\"A1\".\"СтавкаНДСПоУмолчанию\",\"A1\".\"ТипРесурсаПоУмолчанию\",\"A1\".\"УстанавливатьЛимитКредита\",\"A1\".\"СуммаЛимитаКредита\",\"A1\".\"ВалютаЛимитаКредита\",\"A1\".\"УстанавливатьСрокВозврата\",\"A1\".\"СрокКредита\" FROM "User" A1 WHERE \"A1\".\"DocID\" =1 ORDER BY \"A1\".\"DocID\"");

hr = pConnection.CreateInstance(__uuidof(Connection));
hr = pConnection->Open(_T("Provider=LinOleDB;Prompt=1;"), _T("SYSTEM"), _T("MANAGER"), -1);
hr = pRst.CreateInstance(__uuidof(Recordset));
hr = pRst->Open(tszQuery, _variant_t((IDispatch*)pConnection, true), adOpenForwardOnly, adLockReadOnly, adCmdText);
cFields = pRst->Fields->Count;
vttarray = pRst->GetRows(10000);
hr = SafeArrayGetUBound(vttarray.parray, 2, &lUbound);
for (lRecords = 0; lRecords < lUbound + 1; lRecords++)
{
result.vt = VT_BSTR;
for (lFields = 0; lFields < cFields; lFields++)
{
rgIndices[0] = lFields;
rgIndices[1] = lRecords;
hr = SafeArrayGetElement(vttarray.parray, rgIndices, &result);
...
}
}
...
Рейтинг: 0 / 0
Линтер, зависание запроса в ADO
    #36389517
dr.Offspring
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xuser,

Попробовал, как в Вашем примере - без объекта команды с передачей на прямую строки запроса и конекшена. Та же ошибка... :(
Причём, другие запросы к другим таблицам с однотипными полями выполняются без ошибок.
К сожалению, без объекта команды обойтись не получится, т.к. активно используются передача значений через параметры, например, в фильтрах...
...
Рейтинг: 0 / 0
Линтер, зависание запроса в ADO
    #36391946
xuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ответ отправил вчера в личку. Если можно, пришлите маленький тестовый проект на Delphi с работающим у Вас запросом, (или два - с работающим и с неработающим). И еще сообщите
Вашу версию Delphi.
...
Рейтинг: 0 / 0
Линтер, зависание запроса в ADO
    #36393847
dr.Offspring
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xuser,

Пример подготовлю и вышлю после новогодних праздников.
Delphi 5 Enterprise Build 6.18 update pack 1, лицензионная...
...
Рейтинг: 0 / 0
Линтер, зависание запроса в ADO
    #36409841
dr.Offspring
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отправил Вам пример для воспроизведения ошибки...
...
Рейтинг: 0 / 0
Линтер, зависание запроса в ADO
    #36410470
xuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пример получил, проблема воспроизвелась, разбираемся, завтра ответим.
...
Рейтинг: 0 / 0
Линтер, зависание запроса в ADO
    #36412941
xuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dr. Offspring,
обновленный модуль, в котором устранена описанная проблема, отправлен Вам по E-mail.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Другие СУБД [игнор отключен] [закрыт для гостей] / Линтер, зависание запроса в ADO
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]