Чтение большого файла (> 5 МБ) из поля BLOB (контейнера) из Filemaker с использованием VB.NET - PullRequest
0 голосов
/ 04 мая 2011

Я пытаюсь прочитать двоичный файл из поля контейнера FileMaker 11, используя собственный драйвер ODBC Filemaker. Я был в состоянии записать файлы в базу данных, и это прекрасно работает. извлечение их вручную работает нормально, файлы выглядят нормально и не повреждены.

Однако при получении их с использованием VB.NET, и если размер файла составляет приблизительно> 5 МБ, я получаю следующую ошибку «uncatchable» (да, верно, я не могу «Try Catch End Try», она просто падает):

System.AccessViolationException was unhandled
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

Получение файла размером <5 МБ работает нормально. </p>

Вот код и где он падает:

Using cn2 As New Odbc.OdbcConnection(G_AppSettings.ODBC_FileMaker("xxx", "xxx", "xxx")) ' Establish ODBC connection to FileMaker DB
     cn2.Open()

     cmd = New OdbcCommand("SELECT DocumentName, GetAs(DocumentContainer, 'FILE') FROM Documents WHERE DocumentID = " & id, cn2)
     myReader = cmd.ExecuteReader()

     If myReader.Read() Then

          ' get the name of the file
          If Not myReader.IsDBNull(0) Then
                TempDoc.FileName = myReader.GetValue(0)
          End If


          ' check for problems:
          If TempDoc.FileName = "" Then
                MsgBox("Error: file name not specified. Could not open file.")
                Exit Sub
          End If
          If tempDir = "" Then
                MsgBox("Error: can't find local temp directory. Could not open file.")
                Exit Sub
          End If

          ' -----------------------------
          ' SAVE FILE IN TEMP WINDOWS DIR
          ' -----------------------------
          fs = New FileStream(tempDir & "\" & TempDoc.FileName, FileMode.OpenOrCreate, FileAccess.Write)
          bw = New BinaryWriter(fs)

          ' Read bytes into outbyte() and retain the number of bytes returned.
          Dim ds1 = myReader.GetDataTypeName(1)
          Dim ds2 = myReader.GetFieldType(1)

          Dim bytesRead = myReader.GetBytes(1, 0, outbyte, 0, bufferSize) < - CRASHES HERE

          retval = myReader.GetBytes(1, startIndex, outbyte, 0, bufferSize)

          ' Continue reading and writing while there are bytes beyond the size of the buffer.
          Do While retval = bufferSize
                bw.Write(outbyte)
                bw.Flush()

                ' Reposition the start index to the end of the last buffer and fill the buffer.
                startIndex += bufferSize
                retval = myReader.GetBytes(1, startIndex, outbyte, 0, bufferSize)
          Loop

          ' Write the remaining buffer.
          bw.Write(outbyte, 0, retval - 1)
          bw.Flush()

          ' Close the output file.
          bw.Close()
          fs.Close()

     End If

     cn2.Close()
End Using

Я использую клиенты Windows XP / 7 и размещаю базу данных на FileMaker Advanced Server 11.

Любая помощь в этом была бы великолепна!

1 Ответ

1 голос
/ 04 июня 2011

После множества проб и ошибок я наконец-то ответил на свой вопрос.Весь приведенный выше код работает правильно, кроме Я забыл указать поведение для OdbcDataReader

Эта строка:

myReader = cmd.ExecuteReader()

Должно быть:

myReader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)

Кажется, это вызывало проблемы, которые возникали у меня, когда некоторые файлы открывались правильно, а другие - нет.Надеюсь, это поможет кому-то!Тим.

...