【问题标题】:SqlDataAdapter dataset fill padding string with 0SqlDataAdapter 数据集填充填充字符串为 0
【发布时间】:2013-10-07 21:41:50
【问题描述】:

使用 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

【问题讨论】:

  • 你能显示你存储过程的代码吗?
  • 完成。添加了代码以显示正在发生的事情的概要,而不是确切的代码。谢谢。
  • 填充的返回字符串的总长度是255个字符吗?
  • 不,是 32 个字符。
  • 我已经尝试使用您的代码运行测试,它返回的数据没有任何填充。我唯一无法从您的代码中得到工作的是“SPParam”类型,所以我在代码中设置了 SP 参数。我猜问题可能出在这里。您能详细说明 SPParam 是什么吗?

标签: sql-server vb.net string dataset sqldataadapter


【解决方案1】:

在垃圾出来是一个垃圾的情况。

从.NET应用程序传递到SP的VARCHAR @ P_1参数来自字符串类型变量。该变量定义为具有20的长度,因为这是从中读取此变量的源的定义长度。在实践中,所需字符串的长度(根据非空格和非空字符)短于20。但是完整的字符串,空字符和所有字符都被传递给SP,这是原因填充。

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

虽然,所以要找到艰难的一个,因为看Visual Studio中的字符串的值,你会看到所需的字符串(没有显示非打印字符),因此它没有立即显而易见的是实际字符串更长。它没有点击,直到我看看.len属性并看到20%的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    相关资源
    最近更新 更多