2013-09-06 4 views
1

У меня есть метод, который использует ADODB для выполнения sproc и чтения результатов в виде набора записей. Все работало нормально, пока я не изменил одно из полей вывода из varchar (2000) на varchar (max) (SQL2008). Теперь я не могу прочитать данные из этого поля. Странная вещь заключается в том, что данные видны в отладчике сразу после запуска Execute, но пошаговое удаление отладчика приводит к исчезновению данных.Не удается прочитать данные из varchar (max) с помощью ADODB

Вот код:

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 

Если я смотрю в отладчике сразу после того, как Execute я вижу это. Обратите внимание, что поле EacJustCom имеет правильное строковое значение: enter image description here

Я делаю один шаг в отладчике и вижу это. Значение ушло. Обратите внимание, что поле «_account» цел (она определяется как VARCHAR (100)): enter image description here

+0

Вот что-то связано, но нет ответа: http://forums.iis.net/t/1051953.aspx –

ответ

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 
1

Проблемы у Вас есть в том, что VARCHAR (макс) может вместить до 2 Гб данных.

В старые времена с Visual Basic и DAO был вызов метода GetChunk() для чтения битов данных из двоичного поля и AppendChunk() для записи бит. Используйте двоичный или текстовый поток, чтобы объединить данные на стороне клиента.

«Использовать метод GetChunk для объекта Field для извлечения части или всех ее длинных двоичных или символьных данных».

См. Ссылку MSDN.

Эти feilds должны обрабатываться иначе, чем обычный набор записей. Исключите их из своего набора записей.

Отметьте эту статью Who is afraid of the big bad blob?

Поскольку существует так много сред разработки, vs xxx или ADO или ADO.NET, трудно указать на конкретные проблемы без дополнительной информации.

Ответь мне, если это помогает ...

+0

Я нашел обходной путь, прежде чем я попробовал вашу идею. Thx для ответа, tho. –