VB.NET を使用して BLOB を MySQL データベースに保存すると失敗することがあります。PDFを保存しています。
コンピューターで PDF を開くと、うまく機能します。次に、それを db に保存します。ほとんどの場合、find で動作します。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 " & _
"expense_invoicename=@expense_invoicename," & _
"expense_invoicefilesize=@expense_invoicefilesize," & _
"expense_invoiceblob=@expense_invoiceblob," & _
"expense_invoicetype=@expense_invoicetype, " & _
"expense_invoiceexistsinguid=@expense_invoiceexistsinguid " & _
"WHERE " & _
"expense_guid=@expense_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