2012-04-25 6 views
1

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

これは、フィールドのデータのサンプル(私はプライバシーの目的のためにそれを切り捨てています)です:

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サーバーのクエリから直接ファイルを開くことは可能ですか?

+1

MySQLプロバイダではなくSQL ADO.NETプロバイダを使用すべきですか? –

+0

DTSパッケージを使用して、データを読み取っているMySQLクライアントにデータを転送します。データ変換に問題はないことが確認されているので、上記の関数はMySQLからSQL Serverにあったものと同じデータを読み込みます。私はおそらくそれを言及すべきでした! –

答えて

0

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

関連する問題