0

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
4

1 に答える 1