TMSQuery.Options.AutoPrepare при работе с временными таблицами

Обсуждение возникших проблем, предложений и ошибок SDAC компонентов
Ответить
DmitryG
Сообщения: 5
Зарегистрирован: Пн 25 апр 2016 12:50

TMSQuery.Options.AutoPrepare при работе с временными таблицами

Сообщение DmitryG » Пн 25 апр 2016 12:56

MS SQL Server 2014
Имеется хранимая процедура, посредством которой происходит вставка во временную таблицу.
При включенной опции происходит ошибка "Не удалось определить метаданные, поскольку инструкция "insert into #zzId(inId) select @in1" в процедуре "pr_ZZPutId" использует временную таблицу."
При работе с 2008 сервером подобной ошибки не возникает.

DmitryG
Сообщения: 5
Зарегистрирован: Пн 25 апр 2016 12:50

RE: TMSQuery.Options.AutoPrepare при работе с временными таблицами

Сообщение DmitryG » Ср 27 апр 2016 06:17

Скрипт создания временной таблицы:

Код: Выделить всё

  if object_id('TempDb..#zzId') is not null drop table #zzId
  create table #zzId
  (
    inId int
  )
Скрипт процедуры для вставки во временную таблицу:

Код: Выделить всё

if object_id('dbo.pr_ZZPutId', 'P') is not null drop procedure dbo.pr_ZZPutId
go

create procedure dbo.pr_ZZPutId
    (
      @in1  integer = null,
      @in2  integer = null,
      @in3  integer = null,
      @in4  integer = null,
      @in5  integer = null,
      @in6  integer = null,
      @in7  integer = null,
      @in8  integer = null,
      @in9  integer = null,
      @in10  integer = null,
    )
    with encryption,
    execute as owner
  as
    insert into #zzId(inId) select @in1
    insert into #zzId(inId) select @in2
    insert into #zzId(inId) select @in3
    insert into #zzId(inId) select @in4
    insert into #zzId(inId) select @in5
    insert into #zzId(inId) select @in6
    insert into #zzId(inId) select @in7
    insert into #zzId(inId) select @in8
    insert into #zzId(inId) select @in9
    insert into #zzId(inId) select @in10

go

DmitryG
Сообщения: 5
Зарегистрирован: Пн 25 апр 2016 12:50

Re: TMSQuery.Options.AutoPrepare при работе с временными таблицами

Сообщение DmitryG » Ср 27 апр 2016 06:24

Код: Выделить всё

procedure TForm1.Button2Click(Sender: TObject);
var
  i: Integer;
  idArray: array [0..9] of Variant;
begin
  {MSQuery1.SQL.Text := if object_id('TempDb..#zzId') is not null drop table #zzId
  create table #zzId
  (
    inId int
  )
  }
  MSQuery1.ExecSQL; // Создание временной таблицы

  for i := 0 to 5 do
    idArray[i] := i;

  for i := 6 to 9 do
    idArray[i] := null;

  MSQuery2.Options.AutoPrepare := true;  // <<<<<<<<<<<

  for i := 0 to 9 do
    MSQuery2.ParamByName('Id_' + IntToStr(i + 1)).Value := idArray[i];

{ Вызов процедуры вставки 
MSQuery2.SQL.Text := exec dbo.pr_ZZPutId
    @in1 = :Id_1,
    @in2 = :Id_2,
    @in3 = :Id_3,
    @in4 = :Id_4,
    @in5 = :Id_5,
    @in6 = :Id_6,
    @in7 = :Id_7,
    @in8 = :Id_8,
    @in9 = :Id_9,
    @in10 = :Id_10  
}
  MSQuery2.Execute; 
end;

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: TMSQuery.Options.AutoPrepare при работе с временными таблицами

Сообщение AndreyZ » Ср 27 апр 2016 07:50

Причиной такого поведения является не SDAC, а особенность SQL Server Native Client версии 11 и мы не можем повлиять на это.

Для решения данной проблемы попробуйте для соединения использовать SQL Native Client provider ниже 11 версии или стандартный OLEDB провайдер. Пример кода чтобы использовать SQL Native Client provider 10:

Код: Выделить всё

MSConnection.Options.Provider := prNativeClient;
MSConnection.Options.NativeClientVersion := nc2008;
или для стандартного OLEDB провайдера:

Код: Выделить всё

MSConnection.Options.Provider := prSQL;

DmitryG
Сообщения: 5
Зарегистрирован: Пн 25 апр 2016 12:50

Re: TMSQuery.Options.AutoPrepare при работе с временными таблицами

Сообщение DmitryG » Ср 27 апр 2016 10:06

Ранее мы использовали SDAC версии 6.0.1 и такой ошибки при работе с 2014 сервером не возникало.

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: TMSQuery.Options.AutoPrepare при работе с временными таблицами

Сообщение AndreyZ » Чт 28 апр 2016 11:09

Версия SDAC 6.0.1 не поддерживает SQL Server Native Client 11, т.к. была выпущена до выхода этой версии провайдера. Поэтому при использовании SDAC 6.0.1 описанная вами проблема не возникает.

Чтобы узнать какой провайдер используется для соединения с SQL Server, в дизайн-тайм на форме откройте редактор компонента TMSConnection, установите параметры соединения и нажмите Connect. Если соединения будет успешным, то на закладке Info вы увидите эту информацию о провайдере.

DmitryG
Сообщения: 5
Зарегистрирован: Пн 25 апр 2016 12:50

Re: TMSQuery.Options.AutoPrepare при работе с временными таблицами

Сообщение DmitryG » Чт 28 апр 2016 11:39

Спасибо.
Думаю, нам придётся использовать явное указание в опциях версию нативного клиента.

Ответить