存储过程返回null到VB

时间:2016-07-12 20:23:22

标签: sql-server vb.net tsql stored-procedures

我遇到了一个我无法弄清楚的问题,我的谷歌也失败了,所以我登录后只是为了得到一些专家帮助。

问题很复杂,有一些红色鲱鱼,我可以弄清楚,加上我们处理敏感信息时,我无法提供确切的代码。请耐心等待,我会尝试尽可能精确和描述性。

问题的简短版本:我有一个存储过程(在SQL Server 2008 R2服务器上),当在服务器上直接执行时,它返回一行。当通过VB.net代码(Visual Studio 2013环境)执行相同的存储过程时,其中一个列的值将更改为DBNull。

带代码示例的长版本:

以下是存储过程的清理版本

Create PROCEDURE MySP
    @inputParms [five of them]
AS
BEGIN
    DECLARE @UserCanRun int
    DECLARE @ThisApp INT

    EXEC @UserCanRun = dbname.dbo.CheckUserCanRun @InputParm1, @ThisApp --security check

    IF @UserCanRun = 0 --Means no problem, can continue
    BEGIN
        DECLARE @ExtraInfo varchar(100)

        SELECT @ExtraInfo = typeID + ' - ' + typeName
        FROM [three joined tables]
        WHERE [conditions using some @InputParm4]

        SELECT DISTINCT 
            col1, ..., [colN-1], @ExtraInfo as colN, [colN+1], ..., colM
        FROM 
            [8 joined tables and subqueries]
        WHERE 
            [more conditions with @InputParms2 to 5]
    END
END
GO

直接在数据库上执行时,此存储过程运行正常;它返回一行,所有(可用)信息的值都设置正确。 (你会注意到colN;它是给我带来麻烦的人;同事向我保证,它使用变量中的值不应该成为一个问题。)

现在,当我从VB.net代码中调用它时:

dim rTable As DataTable
dim myCmd = New SqlCommand(SPName, myConnectionString)
dim parameter As SQLParameter
dim rValue As Integer = 0

[set SQL parameters]

If not myCmd is Nothing Then
    If myCmd.Connection.State = connectionstate.Closed Then
        [bit of security check code]
        command.Connection.Open()
    End If
    Dim myAdapter As New SqlDataAdapter
    myAdapter.SelectCommand = myCmd
    myAdapter.Fill(rTable) 'problem!
    ReturnValue = CInt(myCmd.Parameters(RETURN_VALUE_FIELD).Value)
End If
[more code]

如果我在rTable命令执行后快速监视myAdapter.Fill,则值rTable.Rows(0).Item([M])将返回DBNull,而直接获取时,DBNull不会返回DataTable SP,使用完全相同的参数。

我没有该表的数据集;您可以看到它使用泛型@ExtraInfo(代码是从特定于应用程序的对象改编来简化所有存储过程调用,因此我无法创建数据集并在此级别使用它)。所以我没有想到。

我已检查过该值的有效性;我甚至检查了varchar值的每个字符的Unicode值,以确保没有一些意外放入的控制字符。它与显示的值相匹配,因此没有坏字符会使值变得混乱。

这在代码中的一些地方使用,但似乎对我们的生产环境中的一组特定数据失败;我还没有能够在我们的开发环境中重现这个问题。所以我不能进去玩它。

是否有人知道还有什么可能导致列的值通过SqlDataAdapter.Fill()从非空的非空sort(unique(get(input$dataset)[, input$columns]))转到DBNull?我无法进入那个电话,所以我失明了。

(另外值得注意的是,也许:我已经使用VB.net大约两年了,调试现有的系统,所以我可能会遗漏一些明显的东西;虽然我更有经验的同事也不理解它。 )

编辑添加关于问题的最后一句话:我从未找到解决方案,除了老墨菲的法律。在搁置了一段时间之后,我让一位同事看一看。当我向他展示时,问题并没有发生。另一项测试后来证实它表现正常。我无法向任何人承诺墨菲定律是一个可靠的解决方案,但我只能建议有一些短暂的错误会自行消失。如果它发生在您身上,祝您好运,如果您找到解决方案,甚至是诊断方法,请告诉我们。谢谢!

1 个答案:

答案 0 :(得分:0)

您的存储过程在开头需要SET NOCOUNT ON