2011年3月30日水曜日

DBに画像データをバイナリで登録 SQLServer + VB.NET

こういった処理は今までやったことはなく。

検索してもあまり理解できず。

またズレたとこでつまずいて大いに時間をかけてしまいました。


環境
SQL Server 2005
Visual Studio 2005
VB.NET


VB.NETで簡単なユーザーを管理する画面を作成中。

単純なマスタメンテ画面です。

そこに顔写真を登録したいとのことで。

最初は画像ファイルを一括して管理する所定のフォルダを作成しそこで管理しようかと。

ただそれも面倒なのでいっそのことDBへ登録してしまえということになり、調査開始。


まずはDB側の設定。

画像登録用のカラム追加。
カラム名:picture 型:varbinary(max)


画面側の処理を追加

まずは選択した画像ファイルをバイナリに変換する。
-----------------------------------------------------------------

    Private Function f_GetPhoto(ByVal filePath As String) As Byte()
            Dim stream As FileStream = New FileStream(filePath, FileMode.Open, FileAccess.Read)
            Dim reader As BinaryReader = New BinaryReader(stream)
            Dim photo() As Byte = reader.ReadBytes(CType(stream.Length, Integer))


            reader.Close()
            stream.Close()


            Return photo
    End Function
-----------------------------------------------------------------


次に画像から変換したバイナリデータをDBへ登録。
-----------------------------------------------------------------
Private Sub s_AddPicture(ByVal PicBinary As Byte())
'※PicBinary ←画像データを変換し取得したバイナリデータ



追加の場合
Dim strSQL As String = ""
strSQL = ""
strSQL &= vbCrLf & " INSERT INTO Staff"
strSQL &= vbCrLf & "("
strSQL &= vbCrLf & " picture"
strSQL &= vbCrLf & ")"
strSQL &= vbCrLf & " VALUES "
strSQL &= vbCrLf & "("
strSQL &= vbCrLf & " @pic"
strSQL &= vbCrLf & ")"


更新の場合
Dim strSQL As String = ""
strSQL = ""
strSQL &= vbCrLf & " UPDATE Staff SET"
strSQL &= vbCrLf & " picture = @pic"
strSQL &= vbCrLf & " WHERE "
strSQL &= vbCrLf & " staff_id = '" & Me.txtStaff_Id.Text & "'"


登録処理
Using con As New SqlClient.SqlConnection(ConnectionString)
   Dim cmd As New SqlClient.SqlCommand(strSQL, con)
   cmd.Parameters.Add("@pic", SqlDbType.Binary, PicBinary.Length).Value = PicBinary
   con.Open()
   cmd.ExecuteNonQuery()
End Using


End Sub
-----------------------------------------------------------------

登録後、データを呼び出した場合は画面のPictureBoxに画像データを表示します。
-----------------------------------------------------------------

Private Sub s_SetPicFromDB(ByVal getbyte As Byte())
getbyte←DBから取得したバイナリデータ
    If IsNothing(getbyte) = False Then
        Dim imgconv As New ImageConverter()
        Dim img As Image = CType(imgconv.ConvertFrom(getbyte), Image)
        '画像の大きさをPictureBoxに合わせる
        Me.PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
        '画像を表示する
        Me.PictureBox1.Image = img
    Else
        Me.PictureBox1.Image = Nothing
    End If


End Sub
-----------------------------------------------------------------



自分じゃなかったらすぐ終わっちゃいそうでした。

費やした時間を戻して欲しい。

わからないことが多すぎて。

日々精進。

超図解 VB.NETルールブック (超図解シリーズ)


0 件のコメント:

コメントを投稿