Имея странную проблему с использованием SqlDataAdapter для выполнения хранимой процедуры и возврата набора результатов. Процедура возвращает одно строковое значение и выполняется правильно и возвращает правильное значение при выполнении в SSMS. Но по какой-то причине SqlDataAdapter.Fill для DataSet приводит к тому, что результат будет дополнен ведущими 0 символами.SqlDataAdapter dataset заполняет строку заполнения 0
Например, выполнение sp в базе данных возвращает '175190336289169307', но выполнение с помощью метода .Fill (или ExecuteScalar также) возвращает '00000000000000175190336289169307'.
Любые идеи, что происходит? Есть ли способ сделать или преобразовать этот результат, чтобы сделать его правильным? Благодарю.
Dim param As SPParam
Dim r As String = ""
_cn = New SqlConnection(_connection)
_cn.Open()
_da = New SqlDataAdapter
_cmd = _cn.CreateCommand
_cmd.CommandType = CommandType.StoredProcedure
_cmd.CommandText = _StoredProcName
For Each param In _SPParams
_cmd.Parameters.Add(param.SQLParam)
Next
Select Case Type
Case ExecuteType.Scalar
r = _cmd.ExecuteScalar.ToString
Case ExecuteType.CommandOnly
r = _cmd.ExecuteNonQuery
Case ExecuteType.Tabular
_da.SelectCommand = _cmd
_ds = New DataSet
_da.Fill(_ds)
End Select
For Each param In _SPParams
param.Value = param.SQLParam.Value
Next
Return r
Это скелет кода SQL. Довольно просто. Существует оболочка sp, которая вызывает основную скалярную функцию. Тип возвращаемого значения функции (в конечном счете также тип возврата sp) - VARCHAR (255). Возвращаемое значение начинается как пустая строка, а за один раз создается кусок для создания возвращаемой строки. Вызов либо функции, либо оболочки sp в SSMS возвращает только конечную строку. Нет ведущих 0 символов.
-- wrapper stored procedure
CREATE PROCedure [dbo].[sp_fubar]
@p_1 VARCHAR(120),
@p_Status INT = 0 Output ,
@p_ErrMsg VARCHAR(1000) = '' Output
AS
BEGIN TRY
Set NOCOUNT ON;
Set @p_Status = 99
Set @p_ErrMsg = 'Unknown error'
SELECT dbo.BaseFunction(@p_1) as [Result]
Set @p_Status = 0
Set @p_ErrMsg = 'Success'
END TRY
BEGIN CATCH
Set @p_Status = 16
Set @p_ErrMsg = 'Error in sp_fubar: ' + ERROR_MESSAGE()
END CATCH;
GO
-- base function call
CREATE FUNCTION [dbo].[BaseFunction] (
@p_InputData VARCHAR(40)
)
RETURNS VARCHAR(255)
AS
BEGIN
-- Declare the return variable here
DECLARE @p_ReturnData VARCHAR(255)
declare
@len as integer,
@c as integer
-- Trim off access spaces
set @p_InputData = ltrim(rtrim(@p_InputData))
-- Get the length of the given data
set @len = len(@p_InputData)
while (@len >= 1)
begin
-- Get the ascii value of each character
set @c = ascii(substring(@p_InputData, @len, 1))
-- Do stuff with @c
set @p_ReturnData = @p_ReturnData + cast(@c as varchar)
set @len = @len - 1
end
-- Return the result of the function
RETURN @p_ReturnData
END
GO
Можете ли вы показать код хранимой процедуры? – GrandMasterFlush
Готово. Добавлен код, показывающий сущность происходящего, а не точный код. Благодарю. – KeithB
Является ли общая длина заполненной строки возвратом 255 символов? – GrandMasterFlush