2013-05-10 62 views
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 
+0

我會嘗試在寫入流關閉之前添加'fs.Flush();'。並且可能在創建和關閉時使用聲明以確保正確處理流。不能在這裏測試,所以,如果它工作讓我知道 – Steve 2013-05-10 11:23:16

+0

@Steve謝謝你,但沒有幫助。 – tmighty 2013-05-10 11:29:08

+0

我發現(使用WinHex)我的磁盤上的pdf(我保存到數據庫)中的某個點上有0個數據,而來自db的pdf有更多的數據。我想r.GetBytes(r.GetOrdinal(「expense_invoiceblob」),0,rawData,0,FileSize)填充一些垃圾。也許FileSize(聲明爲UInt32)是錯誤的? – tmighty 2013-05-10 11:42:33

回答

0

我在db中選擇了「blob」作爲列類型。 相反,我應該選擇「longblob」。