2013-05-10 31 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”。