Sql server SqlDataAdapter数据集使用0填充填充字符串
使用SqlDataAdapter执行存储过程并返回结果集时出现奇怪问题。该过程返回单个字符串值,并在SSMS中执行时正确执行并返回正确的值。但由于某些原因,数据集的SqlDataAdapter.Fill导致结果以前导0字符填充Sql server SqlDataAdapter数据集使用0填充填充字符串,sql-server,vb.net,string,dataset,sqldataadapter,Sql Server,Vb.net,String,Dataset,Sqldataadapter,使用SqlDataAdapter执行存储过程并返回结果集时出现奇怪问题。该过程返回单个字符串值,并在SSMS中执行时正确执行并返回正确的值。但由于某些原因,数据集的SqlDataAdapter.Fill导致结果以前导0字符填充 -- wrapper stored procedure CREATE PROCedure [dbo].[sp_fubar] @p_1 VARCHAR(120), @p_Status INT = 0 Output , @p_ErrMsg VARCH
-- 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
例如,在数据库中执行sp会返回“175190336289169307”,但通过.Fill方法或ExecuteScalar执行也会返回“00000000000000 175190336289169307”
知道发生了什么事吗?是否有某种方法可以强制转换或转换此结果以使其正确?谢谢
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的返回类型为VARCHAR255。返回值以空字符串开始,并一次构建一个块来创建返回字符串。在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
原来是一个垃圾箱里的垃圾 从.net应用程序传递给sp的varchar@p_1参数来自字符串类型变量。此变量的定义长度为20,因为这是从中读取此变量的源的定义长度。但实际上,所需字符串的长度(以非空白和非空字符表示)小于20。但是完整字符串、空字符和所有字符都被传递到sp,这就是填充的原因 由于找不到在.net中直接指定或重新标注字符串类型长度的方法,我添加了一个快速循环来修剪字符串,问题得到了解决
但是很难找到,因为在VisualStudio中查看字符串的值时,您会看到所需的字符串,而不显示非打印字符,因此实际字符串的长度并不是很明显。直到我查看.Len属性并看到值为20时,它才开始单击。能否显示存储过程的代码?完成。添加代码以显示正在进行的jist,而不是确切的代码。谢谢。带填充的返回字符串的总长度是255个字符吗?不,是32个字符。我试着用你的代码运行一个测试,它返回的数据没有任何填充。我唯一无法从您的代码中工作的是SPParam类型,因此我在代码中设置了SP参数。我想问题可能就在这里。你能详细说明什么是SPParam吗?