2

我有一个使用 ADODB 执行存储过程并将结果作为记录集读取的方法。一切正常,直到我将输出字段之一从 varchar(2000) 更改为 varchar(max) (SQL2008)。现在我无法从该字段中读取数据。奇怪的是,数据在运行Execute后立即在调试器中可见,但单步进入调试器会使数据消失。

这是代码:

Public Function sproc_RptEAComment(ByVal accountName As String, ByVal contractName As String,
                                            ByVal acctType As String, ByVal asOfDate As DateTime,
                                            ByVal sessionID As String, ByVal clin As String,
                                            ByVal dollarDisplay As String) As List(Of sproc_RptEAComment_Row) Implements ISprocRepository.sproc_RptEAComment
    Try

        Dim cmd = New Command()
        cmd.ActiveConnection = Connection
        cmd.CommandType = CommandTypeEnum.adCmdStoredProc
        cmd.CommandText = "sproc_RptEAComment"

        ADOUtilities.AddParamToSproc(cmd, "@ChargeNum", accountName)
        ADOUtilities.AddParamToSproc(cmd, "@Contract", contractName)
        ADOUtilities.AddParamToSproc(cmd, "@EmployeeName", "")
        ADOUtilities.AddParamToSproc(cmd, "@Org", acctType)
        ADOUtilities.AddParamToSproc(cmd, "@HoursVal", "TRUE")
        ADOUtilities.AddParamToSproc(cmd, "@Sort", "1")
        ADOUtilities.AddParamToSproc(cmd, "@Employer", "")
        ADOUtilities.AddParamToSproc(cmd, "@Type", "1")
        ADOUtilities.AddParamToSproc(cmd, "@FromD", asOfDate.ToShortDateString())
        ADOUtilities.AddParamToSproc(cmd, "@ToD", asOfDate.AddMonths(-5).ToShortDateString()) 
        ADOUtilities.AddParamToSproc(cmd, "@SessionID", sessionID)
        ADOUtilities.AddParamToSproc(cmd, "@Clin", clin)
        ADOUtilities.AddParamToSproc(cmd, "@RptDisplay", "")
        ADOUtilities.AddParamToSproc(cmd, "@Parm_DT", dollarDisplay)

        Dim lst = New List(Of sproc_RptEAComment_Row)
        Dim rs = cmd.Execute()
        While Not (rs.EOF)
            Dim newEntity = New sproc_RptEAComment_Row(rs)
            lst.Add(newEntity)
            rs.MoveNext()
        End While
        Return lst

    Catch ex As Exception
        MsgLogger.Err(ex)
        Return Nothing
    End Try
End Function

如果我在执行后立即查看调试器,我会看到这一点。请注意 EacJustCom 字段具有正确的字符串值: 在此处输入图像描述

我在调试器中迈出了一步,看到了这一点。价值消失了。请注意,“_Account”字段仍然完好无损(它被定义为 varchar(100)): 在此处输入图像描述

4

2 回答 2

2

您遇到的问题是 varchar(max) 最多可以容纳 2 GB 的数据。

在过去的 Visual Basic 和 DAO 中,有一个方法调用 GetChunk() 从二进制字段中读取数据位,并调用 AppendChunk() 来写入位。使用二进制或文本文件流将数据重新放在客户端。

“在 Field 对象上使用 GetChunk 方法来检索其部分或全部长二进制或字符数据。”

请参阅MSDN参考。

这些字段的处理方式必须与常规记录集不同。将它们从您的记录集中排除。

看看这篇文章谁害怕大坏块

由于有这么多的开发环境,与 xxx 或 ADO 或 ADO.NET 相比,很难在没有更多信息的情况下指出您的特定问题。

如果这有帮助,请回信给我...

于 2013-09-06T16:02:48.557 回答
1

我从未找到问题的答案,但确实找到了解决方法。如果我先创建记录集并从命令中填充它,它就可以工作。

        Dim rs As New ADODB.Recordset()
        rs.CursorLocation = ADODB.CursorLocationEnum.adUseClient
        rs.CursorType = ADODB.CursorTypeEnum.adOpenForwardOnly
        rs.LockType = ADODB.LockTypeEnum.adLockBatchOptimistic
        rs.StayInSync = False
        rs.Open(cmd)
        rs.ActiveConnection = Nothing

        Dim lst = New List(Of sproc_RptEAComment_Row)
        While Not (rs.EOF)
            Dim newEntity = New sproc_RptEAComment_Row(rs)
            lst.Add(newEntity)
            rs.MoveNext()
        End While
        Return lst
于 2013-09-07T12:32:56.437 回答