我有一个使用 ADODB 执行存储过程并将结果作为记录集读取的方法。 一切都工作正常,直到我将输出字段之一从 varchar(2000) 更改为 varchar(max) (SQL2008)。现在我无法从该字段读取数据。 奇怪的是,运行执行后,数据立即在调试器中可见,但是单步调试器会使数据消失。
这是代码:
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)):
您遇到的问题是 varchar(max) 最多可以容纳 2 GB 的数据。
在过去使用 Visual Basic 和 DAO 时,有一个方法调用 GetChunk() 来从二进制字段读取数据位,并调用 AppendChunk() 来写入位。 使用二进制或文本文件流在客户端将数据重新组合在一起。
“在 Field 对象上使用 GetChunk 方法来检索其部分或全部长二进制或字符数据。”
请参阅 MSDN 参考。
这些字段的处理方式必须与常规记录集不同。 将它们从您的记录集中排除。
看看这篇文章谁害怕大坏块?
由于开发环境如此之多,与 xxx 或 ADO 或 ADO.NET 相比,很难在没有更多信息的情况下指出您的特定问题。
如果这有帮助,请给我回信...
我从未找到问题的答案,但确实找到了解决方法。 如果我首先创建记录集并从命令填充它,它就可以工作。
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
虽然明显被贬值,但我发现使用 SQL Server“文本”数据类型效果非常好。我从未设法使用 ADODB 使 nvarchar(MAX) 数据类型正常工作。