无法使用ADODB从varchar(max)读取数据

时间:2013-09-06 14:17:06

标签: sql-server vb.net adodb varcharmax

我有一个使用ADODB执行sproc并将结果作为记录集读取的方法。一切都工作正常,直到我将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具有正确的字符串值: enter image description here

我在调试器中迈出了一步,看到了这一点。价值消失了。请注意,字段“_Account”仍然完好无损(它定义为varchar(100)): enter image description here

2 个答案:

答案 0 :(得分:2)

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

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

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

请参阅MSDN参考。

这些游戏必须以不同于常规记录集的方式处理。从记录集中排除它们。

查看此文章Who is afraid of the big bad blob

由于开发环境太多,与xxx或ADO或ADO.NET相比,很难用更多信息指出您的特定问题。

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

答案 1 :(得分: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