0
有时使用VB.NET将一个BLOB保存到一个MySQL数据库失败。 我正在保存PDF文件。VB.NET某些文件的MySQL blob保存失败
当我在计算机上打开PDF时,效果很好。 然后我将它保存为db,并且大多数情况下它都可以找到。 我再次从数据库中检索pdf,将其保存到一个文件,我可以打开它。
但是有时Acrobat Reader不想打开新保存的PDF文件,说该文件已损坏。
我不确定在我的代码中有什么缺陷。 如果有人能帮忙,这将是非常好的。 谢谢。
Private Function pUpdateInvoice(ByVal uGUID As String, ByVal uPath As String) As Boolean
Dim rawData() As Byte
Dim fs As FileStream
Try
fs = New FileStream(uPath, FileMode.Open, FileAccess.Read)
Dim iFileSize As UInt32
iFileSize = fs.Length
rawData = New Byte(iFileSize) {}
fs.Read(rawData, 0, iFileSize)
fs.Close()
If Not g_CnWebDB.Ping Then
InitMySQL()
End If
Dim sFileName$
sFileName = CleanFile(uPath, False)
Dim sSQL
sSQL = "UPDATE expenses SET " & _
"[email protected]_invoicename," & _
"[email protected]_invoicefilesize," & _
"[email protected]_invoiceblob," & _
"[email protected]_invoicetype, " & _
"[email protected]_invoiceexistsinguid " & _
"WHERE " & _
"[email protected]_guid"
Dim cmd As New MySqlCommand
cmd.Connection = g_CnWebDB
cmd.CommandText = sSQL
cmd.Parameters.AddWithValue("expense_invoicename", sFileName)
cmd.Parameters.AddWithValue("expense_invoicefilesize", iFileSize)
cmd.Parameters.AddWithValue("expense_invoiceblob", rawData)
cmd.Parameters.AddWithValue("expense_invoicetype", eInvoiceType.eIT_Digital)
cmd.Parameters.AddWithValue("expense_invoiceexistsinguid", "")
cmd.Parameters.AddWithValue("expense_guid", uGUID)
cmd.ExecuteNonQuery()
Return True
Catch ex As Exception
MessageBox.Show("There was an error: " & ex.Message, "Error", _
MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
Return False
End Function
Private Sub pShowPDF(ByVal uGUID As String)
If Not g_CnWebDB.Ping Then
InitMySQL()
End If
Dim cmdSel As New MySqlCommand("SELECT * FROM expenses WHERE expense_guid=" & Apo(uGUID), g_CnWebDB)
Dim r As MySqlDataReader
r = cmdSel.ExecuteReader
If Not r.HasRows Then
Stop
End If
r.Read()
Dim FileSize As UInt32
FileSize = r.GetUInt32(r.GetOrdinal("expense_invoicefilesize"))
Dim rawData() As Byte
rawData = New Byte(FileSize) {}
r.GetBytes(r.GetOrdinal("expense_invoiceblob"), 0, rawData, 0, FileSize)
r.Close()
Dim sPath$
sPath = "m:\temp.pdf"
modIO.DeleteFile(sPath)
Dim fs As FileStream
fs = New FileStream(sPath, FileMode.OpenOrCreate, FileAccess.Write)
fs.Write(rawData, 0, FileSize)
fs.Close()
Dim id As Integer
id = System.Diagnostics.Process.Start(sPath).Id
End Sub
我会尝试在写入流关闭之前添加'fs.Flush();'。并且可能在创建和关闭时使用声明以确保正确处理流。不能在这里测试,所以,如果它工作让我知道 – Steve 2013-05-10 11:23:16
@Steve谢谢你,但没有帮助。 – tmighty 2013-05-10 11:29:08
我发现(使用WinHex)我的磁盘上的pdf(我保存到数据库)中的某个点上有0个数据,而来自db的pdf有更多的数据。我想r.GetBytes(r.GetOrdinal(“expense_invoiceblob”),0,rawData,0,FileSize)填充一些垃圾。也许FileSize(声明为UInt32)是错误的? – tmighty 2013-05-10 11:42:33