1

我已经将一些逻辑写入了一个 sproc,它返回 1 或 0 表示真/假。如果我手动运行它会很好,但是如果我从 VB 调用它,我总是得到 0/false,不管 sproc 返回的实际值是什么。可能错过了一些愚蠢的东西,但我只是没有看到它。该代码部分地从我们系统中的其他代码复制而来,这些代码可以正常工作,但使用动态构造的 sproc 调用。我正在尝试修改该代码以使用参数化的 sproc 调用。

sproc 返回名为“Allowed”的列中的值。

VB 代码(针对变量名称/内容进行了复制和清理)如下所示:

Public Function sample(ByVal parm1 As String, ByVal parm2 As String) As Boolean                
    Dim Allowed As Boolean = False
    Try           
        Dim MyConnection As New SqlConnection(ConnString)
        Dim MyDataAdapter As New SqlDataAdapter("sproc", MyConnection)
        Dim DS As New DataSet
        MyDataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure
        MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@parm1", SqlDbType.Char, 14))
        MyDataAdapter.SelectCommand.Parameters("@parm1").Value = parm1
        MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@parm2", SqlDbType.Char, 30))
        MyDataAdapter.SelectCommand.Parameters("@parm2").Value = parm2.ToUpper()
        MyDataAdapter.Fill(DS)
        If DS.Tables.Count > 0 Then
            If DS.Tables(0).Rows.Count > 0 Then
                Allowed = Convert.ToBoolean(DS.Tables(0).Rows(0).Item("Allowed"))
            End If
        End If
    Catch ex As Exception
        ' Real code has error handling here that's not getting hit
    End Try
    Return Allowed
End Function
4

2 回答 2

2

如果你只返回一个真/假,你应该使用执行标量。这里有一个很好的例子

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-3

于 2013-01-24T19:10:13.120 回答
1

我会确保在 sproc 中将您的值转换为类似于:select cast(1 as bit)

选择 1 和选择 Cast(1 as bit) 将是两个不同的东西。

于 2013-01-24T20:14:52.090 回答