Конференция "Базы" » ADO (странное поведение) [D5, MSSQL]
 
  • PSV (19.06.08 15:44) [0]
    Здравствуйте. Вопрс в следующем: на MSSQL есть процедура, которую выполняю посредством компонентов ADO (Delphi5). На выполнение требуется максимум 6 сек. Процедура возвращает набор данных. На этапе разработки (Active:=True) отрабатывает нормально. При запуске программы выдает ошибку commandtext does not return result set. Использовал по очереди компоненты TADOQuery, TADOStoredProc,TADoDataSet. Результат-та же ошибка. Запрос перехваченный трассировщиком и запущенный на MSSQL возвращает данные. Урезал процедуру до минимума - выдает не те данные но быстро - около 1 сек. В этом случае все работает - но результаты не те. Впечатление будто если процедура не вложилась в секунду то все. Подскажите как быть.
  • MsGuns © (19.06.08 16:06) [1]
    Код запуска в делфи и текст хранимки сюда
  • stas © (19.06.08 16:06) [2]
    1. Как вызываете процедуру
    2. Покажите текст процедуры
  • PSV (19.06.08 16:27) [3]
    1.Процедура возвращает данные о всех работников предприятия
    Состоит из запроса в несколько таблиц и изменения последней даты перемещения на первую дату перемещения на данную профессию.

    ALTER   PROCEDURE ot_ARM(@FD datetime)

     AS

    Select
    r.TabN
    ,Famil+' '+Imya+' '+Otchectv as F
    ,Mug_Gen
    ,convert(varchar(10),convert(datetime,Dat_rogd),104) as DR--'Дата рожд.'
    ,f.Name+' '+isnull(r.Razr,'') as PR--'Профессия'
    ,d.Name as PD--'Подразделение'
    ,Tel --as 'Телефон'
    ,p.Iden_kod --as 'Иден.код'
    isnull(ltrim(Obl+' '),'')+isnull(ltrim(Gorod+' '),'')+isnull(ltrim(Reg+' '),'')+
    isnull(ltrim(Der+' '),'')+isnull(ltrim(Ul+' '),'')+
    isnull(Dom+' ','')+isnull(ltrim(Korp+' '),'')+isnull(Kv,'') as ADR--'Адрес'
    ,convert(varchar(10),convert(datetime,ar.DFPer),104) DS--'Дата поступл.'
    ,convert(varchar(10),convert(datetime,r.DFPer),104) DD--as 'Дата перемещ.'
    ,r.KodProf,r.Razr,r.DFPer as DP
    into #TMP
    from
    PersPeremNew ar
    ,Personal p
    ,PersData t
    ,PersPeremNew r
    ,Sperem rn
    ,SpodrN d
    ,SprofN f
    where
    ar.VidDog not in(3,5,7,8,6)
    and ar.DFPer in(select Max(DFPer) from PersPeremNew where Iden_kod=p.Iden_kod and VidPer=1 and DFPer<=@FD) and ar.VidPer=1

    and t.InsDate in(select Max(InsDate) from PersData where Iden_kod=p.Iden_kod and InsDate<=@FD)
    and r.VidPer=rn.Id
    and rn.PrCnst>=1
    and r.DFPer in(select Max(DFPer) from PersPeremNew,Sperem where Iden_kod=p.Iden_kod and Id=VidPer and VidPer<>2 and PrCnst>=1 and DFPer<=@FD) and r.VidPer<>2

    and d.KeyPodr=r.KodPodr
    and f.KeyProf=r.KodProf
    and ar.Iden_kod=p.Iden_kod
    and ar.Iden_kod=t.Iden_kod
    and ar.Iden_kod=r.Iden_kod
    and
    p.Iden_kod not in(select Iden_kod from PersPeremNew uv1 where VidPer=2 and DNDog=ar.DFPer and DFPer<=@FD)
    order by Famil,FIO

    while exists(
    select t.Iden_kod from #tTMP t,
    (select t.Iden_kod,max(DFPer)as DFP,DP
    from PersPeremNew n,#tTMP t,Sperem where t.Iden_kod=n.Iden_kod and VidPer=Id and PrCnst=1
    and DFPer<DP group by t.Iden_kod,DP)n,PersPeremNew m,Sperem
    where  t.Iden_kod=m.Iden_kod and t.Iden_kod=n.Iden_kod and m.VidPer=Id and PrCnst=1
    and DFP=m.DFPer and m.KodProf=t.KodProf and isnull(m.Razr,'')=isnull(t.Razr,'')
    )

    update t set t.DP=DFP from #tTMP t,
    (select t.Iden_kod,max(DFPer)as DFP,DP
    from PersPeremNew n,#tTMP t,Sperem where t.Iden_kod=n.Iden_kod and VidPer=Id and PrCnst=1
    and DFPer<DP group by t.Iden_kod,DP)n,PersPeremNew m,Sperem
    where  t.Iden_kod=m.Iden_kod and t.Iden_kod=n.Iden_kod and m.VidPer=Id and PrCnst=1
    and DFP=m.DFPer and m.KodProf=t.KodProf and isnull(m.Razr,'')=isnull(t.Razr,'')

    select TabN as 'Таб.№',F as 'ФИО',Mug_Gen as 'Пол',DR as 'Дата рожд.',PR as 'Профессия',
    PD as 'Подразделение',Tel as 'Телефон',Iden_kod as 'Иден.код',ADR as 'Адрес',
    DS as 'Дата поступл.',convert(varchar(10),convert(datetime,DP),104) as 'Дата перемещ.' from #tTMP
    order by F

    GO

    2. ADOQuery.SQL    ot_ARM :Dt
  • Ega23 © (19.06.08 16:31) [4]
    и сколько этот ужос из QA выполняется?
  • stas © (19.06.08 16:33) [5]
    Это MSSQL 2005 ?
    какая версия MDAC? попробуйте подключится через Native Client
  • Ega23 © (19.06.08 16:55) [6]

    > Это MSSQL 2005 ?


    На каком основании Вы так думаете и какое это имеет значение?
  • PSV (19.06.08 17:06) [7]
    MSSQL 2000 MDAC 2.8 SP1
  • Ega23 © (19.06.08 17:13) [8]

    > MSSQL 2000 MDAC 2.8 SP1
    >

    Сколько секунд идёт выполнение из Query Analyzer?
  • PSV (19.06.08 17:23) [9]
    6 сек.
  • Ega23 © (19.06.08 17:26) [10]
    Чему равно значение TADOConnection.CommandTimeout на клиенте?
  • PSV (19.06.08 17:27) [11]
    30 (по умолчанию)
  • Ega23 © (19.06.08 17:30) [12]
    ALTER   PROCEDURE ot_ARM(@FD datetime = 0)



    Если так, то что?
  • PSV (19.06.08 17:42) [13]
    в Query Analyzer через 1 сек. пустой результат ;с программы - та же ошибка ; из среды разработки как в Query Analyzer
  • PSV (19.06.08 18:02) [14]
    Дело даже не во времени выполнения процедуры. После того, как я убрал создание временной таблицы и цикл, но удлинил время выполнения процедуры путем выполнения 'левых' запросов до 9 сек. она отрабатывает с программы.
  • ЮЮ © (20.06.08 04:41) [15]
    > ADO (Delphi5)

    Древнее Delphi не нашел? Update для ADO установлен?

    SET NOCOUNT ON поставь в процедуре.
  • stud © (20.06.08 10:53) [16]
    а чему равно значение параметра-  даты, при перехвате запроса через профайлер?
  • Ega23 © (20.06.08 10:54) [17]

    > SET NOCOUNT ON поставь в процедуре.


    Кстати да, у тебя же там Update есть...
  • PSV (20.06.08 12:49) [18]
    строка, отображаемая в профайлере:
    exec sp_executesql N'exec ot_ARM @P1
    ', N'@P1 datetime', 'Jun 20 2008 12:00:00:000AM'

    строка SET NOCOUNT ON , добавленная в процедуру - помогла.

    всем откликнувшимся большое спасибо!
 
Конференция "Базы" » ADO (странное поведение) [D5, MSSQL]
Есть новые Нет новых   [134434   +28][b:0][p:0.001]