2013-10-01 2 views
1

Имея странную проблему с использованием 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 
+0

Можете ли вы показать код хранимой процедуры? – GrandMasterFlush

+0

Готово. Добавлен код, показывающий сущность происходящего, а не точный код. Благодарю. – KeithB

+0

Является ли общая длина заполненной строки возвратом 255 символов? – GrandMasterFlush

ответ

0

Оказывается, что это мусор в мусоре.

Параметр varchar @ p_1, передаваемый в sp из приложения .net, поступает из переменной типа String. Эта переменная была определена как имеющая длину 20, так как это определенная длина источника, откуда эта переменная считывается. На практике, однако, длина нужной строки (с точки зрения небелых и непустых символов) короче 20. но полная строка, нулевые символы и все, передавалась в sp, что и было причиной прокладка.

Не найдя способ прямого указания или изменения размера строкового типа в .net, я добавил быстрый цикл, чтобы обрезать строку, и проблема была решена.

Жесткий, чтобы найти, поскольку, глядя на значение строки в Visual Studio, вы видите нужную строку (без отображения непечатаемых символов), поэтому сразу не видно, что фактическая строка длиннее , Он не нажимал, пока я не посмотрел на свойство .Len и не увидел значение 20.

Смежные вопросы