Я пытаюсь прочитать двоичный файл из поля контейнера 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.
Любая помощь в этом была бы великолепна!