Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Проблемы StoredProc у SQL server

Delphi , Базы данных , SQL

Проблемы StoredProc у SQL server

Автор: David Gecawich

Обнаруженная мною проблема заключается в ненормальной работе BDE с TStoredProc, когда хранимая процедура SQL получает на входе параметр типа String. Как я понял, BDE/SQL Links перед вызовом хранимой процедуры заносит в строку управляющие символы. Чтобы обойти эту проблему, Borland предлагает использовать TQuery. Конечно, ничего не стоит перевести TStoredProcs в TQuerys (с сохранением полного набора характеристик и без потери скорости), но мне стала интересна причина такого поведения компонента, и я решил покопаться в TStoredProc насколько это было мне возможно и интересно, для чего я добавил дополнительный параметр к хранимой процедуре, позволяющий указывать длину передаваемой процедуре строки. Затем, уже в процедуре, если реальная длина строки оказывалась больше, с помощью дополнительно передаваемого параметра бралась, и в дальнейшем использовалась только левая часть строки, а остальные управляющие символы игнорировались.

Вот пример:

Приведенная ниже процедура SQL Server возвращает 1 если таблица существует, и 2 в противном случае.

CREATE PROCEDURE up_TableExists
  ( @TableName varchar(50), @TableNameLen int = null)
AS
  declare @CleanTblName varchar(50)
  if @TableNameLen is not null
    select @CleanTblName = SubString(@TableName,1,@TableNameLen)
  else
    select @CleanTblName = @TableName
  if EXISTS (SELECT name FROM sysobjects WHERE name = @CleanTblName)
    RETURN 1
  else
    RETURN 2
Поехали...

В Delphi, прежде чем вызвать ExecProc, установите параметр длины строки... вот пример вызова хранимой процедуры в Delphi...


var
  sTableName: string;
  rc: Boolean;
begin
  ...
  sTableName := 'MyTable';
  with StoredProc1 do
  begin
    ...
      ParamByName('@TableName').AsString := sTableName;
    { обход проблемы: передаем длину строки SQL Server для
    обработки хранимой процедурой }
    ParamByName('@TableNameLen').AsInteger := Length(sTableName);
    Prepare;
    ExecProc;
    rc := ParamByName('Result').AsInteger = 1; {rc True если result = 1}
    if rc then
      ....
  end;
end;

Проблема StoredProc в SQL Server заключается в том, что Borland Database Engine (BDE) автоматически добавляет управляющие символы в строку при передаче параметра типа String хранимой процедуре, что может привести к неправильной работе.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: SQL ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 13:21:41/0.0052859783172607/1