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