1

SQL Server 2005 DBに、ドキュメント(主にPDF)を含む「image」タイプのフィールドがあります。データベースのフィールドを表示すると、データが16進文字列として格納されているように見えます。私は広範囲にグーグルで検索し、フィールドを実際のファイルに変換するために以下のVB.net関数を思いつきましたが、フィールドが表すはずのファイルではなく、16進文字の文字列を含むファイルのみを出力します。

これはフィールドのデータのサンプルです(プライバシー保護のために切り捨てました):

0x1F8B0800000000000400EDBD07601C499625262F6DCA7B7F4AF

そして、フィールドをドキュメントに変換するために私が書いた関数:

    Private Sub SimpleButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SimpleButton1.Click

    sql = New MySqlClient.MySqlConnection(connectionString)

    Dim cmd As New MySqlClient.MySqlCommand("SELECT docdata FROM temp.temp_docs WHERE docid = " + TextEdit1.Text, sql)

    sql.Open()

    Dim dr As MySqlClient.MySqlDataReader = cmd.ExecuteReader()

    dr.Read()

    Dim b(dr.GetBytes(0, 0, Nothing, 0, Integer.MaxValue) - 1) As Byte

    dr.GetBytes(0, 0, b, 0, b.Length)

    dr.Close()

    sql.Close()

    Dim DestFilePath As String = "C:\... \Desktop\" & String.Format("{0:hhmmss}", DateTime.Now) & ".pdf"

    Dim fs As New System.IO.FileStream(DestFilePath, IO.FileMode.Create, IO.FileAccess.Write)

    fs.Write(b, 0, b.Length)

    fs.Close()

End Sub

誰かが私が間違っているところを見つけることができますか?また、SQLサーバーのクエリから直接ファイルを開くことは可能ですか?

4

1 に答える 1

0

IMAGEフィールドには「16進文字列」は含まれていません。それらには、を使用してバイナリストリームとして読み取るバイナリデータが含まれていますSqlBytes.Stream。を使用して、ストリームを目的のファイルにコピーしますStream.CopyTo

于 2012-04-25T17:35:14.700 に答える