Автор: 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;
|
|