我遇到了一个我无法弄清楚的问题,我的谷歌也失败了,所以我登录后只是为了得到一些专家帮助。
问题很复杂,有一些红色鲱鱼,我可以弄清楚,加上我们处理敏感信息时,我无法提供确切的代码。请耐心等待,我会尝试尽可能精确和描述性。
问题的简短版本:我有一个存储过程(在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大约两年了,调试现有的系统,所以我可能会遗漏一些明显的东西;虽然我更有经验的同事也不理解它。 )
编辑添加关于问题的最后一句话:我从未找到解决方案,除了老墨菲的法律。在搁置了一段时间之后,我让一位同事看一看。当我向他展示时,问题并没有发生。另一项测试后来证实它表现正常。我无法向任何人承诺墨菲定律是一个可靠的解决方案,但我只能建议有一些短暂的错误会自行消失。如果它发生在您身上,祝您好运,如果您找到解决方案,甚至是诊断方法,请告诉我们。谢谢!
答案 0 :(得分:0)
您的存储过程在开头需要SET NOCOUNT ON