Delphi - объектно-ориентированный язык программирования, разработанный компанией Borland в 1995 году. Он основан на языке программирования Pascal, но имеет более расширенные возможности и добавлены новые функции.
Delphi является интегрированной средой разработки (IDE), которая позволяет разрабатывать программное обеспечение для различных платформ, включая Windows, macOS, Android и iOS. Delphi достигает многоплатформенности с помощью...
Обнаруженная мною проблема заключается в ненормальной работе 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...
varsTableName: 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
;