首页 文章

SqlDataAdapter数据集填充填充字符串为0

提问于
浏览
1

使用SqlDataAdapter执行存储过程并返回结果集时遇到一个奇怪的问题 . 该过程返回单个字符串值,并在SSMS中执行时正确执行并返回正确的值 . 但由于某种原因,对DataSet的SqlDataAdapter.Fill导致结果以前导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) . 返回值以空字符串开头,并且一次构建一个块以创建返回字符串 . 在SSMS中调用函数或包装器sp只返回最后一个字符串 . 没有前导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

1 回答

  • 0

    原来是垃圾出垃圾的情况 .

    从.net应用程序传递给sp的varchar @ p_1参数来自String类型变量 . 此变量定义为长度为20,因为这是从中读取此变量的源的定义长度 . 但实际上,所需字符串的长度(根据非空格和非空字符)小于20.但是完整字符串,空字符和所有字符串都被传递给sp,这就是填充 .

    没有找到直接指定或重新标注.net中字符串类型长度的方法,我添加了一个快速循环来修剪字符串,问题解决了 .

    虽然很难找到,但是因为在Visual Studio中查看字符串的值,您会看到所需的字符串(不显示非打印字符),因此实际的字符串不会很明显 . 直到我查看.Len属性并且看到值为20才点击它 .

相关问题