none
[Access + VB.NET]如何從Access讀出圖片(兩張圖)讓Picturebox1顯示? RRS feed

  • 問題

  • 大家好,請問:

    我有一個Access資料庫:TAG

    一個資料表:card_info

    欄位1:card_no(自動編號)

    欄位2:card_ID(文字)

    欄位3:card_date(文字)

    欄位4:owner(文字)

    欄位5:card_tag(文字)

    欄位6:Image(OLE物件)

    每個欄位都有兩筆資料,我目前可經由讀取卡號顯示欄位3,4,5資料,但欄位6的圖片我不知道如何讓他顯示?

    下方有我的程式碼,我使用的是VB2008編譯
    • 已編輯 pig1989 2013年1月14日 下午 04:27
    2013年1月14日 下午 04:23

解答

  • 類似這樣吧

    Dim dbconn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=TAG.mdb;User Id=admin;Password=;") dbconn.Open() Dim dbcmd As OleDbCommand = New OleDbCommand("select card_no, card_ID, card_Date, owner, card_tag, [Image] from card_info where card_ID= ?", dbconn) dbcmd.Parameters.Add("card_ID", OleDbType.VarChar).Value = Trim(Mid(TextBox1.Text, 1, 8)) Dim dbreader As OleDbDataReader dbreader = dbcmd.ExecuteReader Dim Length As Long = dbreader.GetBytes(5, 0, Nothing, 0, 0) Dim Buffer(Length) As Byte dbreader.GetBytes(5, 0, Buffer, 0, Length) dbreader.Close() dbconn.Close() Dim stream As New MemoryStream(Buffer) Dim image As Image = Image.FromStream(stream) stream.Flush() stream.Close() PictureBox1.Image = image



    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度

    2013年1月15日 下午 01:42

所有回覆

  • Imports System.Data.OleDb
    
    Public Class Form1
        Sub showmember()
    
            Dim dbconn As OleDbConnection
            dbconn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=TAG.mdb;User Id=admin;Password=;")
            dbconn.Open()
    
            Dim dbcmd As OleDbCommand
            dbcmd = New OleDbCommand("select * from card_info where card_ID='" & Trim(Mid(TextBox1.Text, 1, 8)) & "'", dbconn)
    
            Dim dbreader As OleDbDataReader
            dbreader = dbcmd.ExecuteReader
    
            If dbreader.Read() Then
                Label4.Text = dbreader("owner").ToString
                Label6.Text = dbreader("card_date").ToString
                Label8.Text = dbreader("car_tag").ToString
            Else
                Label4.Text = "此卡號尚未註冊使用者"
                Label6.Text = "N\A"
                Label8.Text = "N\A"
            End If
            dbconn.Close()
    
        End Sub
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            AxMSComm1.Settings = "115200,n,8,1"
            AxMSComm1.CommPort = 9
            AxMSComm1.RThreshold = 1
            AxMSComm1.PortOpen = True
            If AxMSComm1.PortOpen = True Then
                MessageBox.Show("通訊埠開啟成功")
            Else
                MessageBox.Show("通訊埠開啟失敗")
            End If
        End Sub
    
        Dim tagcode As String
        Private Sub AxMSComm1_OnComm(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AxMSComm1.OnComm
            Dim I As Integer
            Select Case AxMSComm1.CommEvent
                Case 2
                    tagcode = tagcode & AxMSComm1.Input
                    If Len(tagcode) >= 48 Then
                        TextBox1.Text = Mid(Trim(tagcode), 3, 8)
                        Call showmember()
                        tagcode = ""
                    End If
                Case 7
                    MsgBox("讀卡機設定或讀取錯誤!", 16, "錯誤")
                    AxMSComm1.PortOpen = False
            End Select
        End Sub
    End Class
    


    2013年1月14日 下午 04:24
  • OleDbDataReader.GetBytes方法

    你的Sql Command有SqlInjection


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度

    2013年1月15日 上午 06:25
  • 感謝樓上大大的回覆

    小弟是新手,能否更請楚的解答

    或者編譯出可行的程式碼讓我看看

    2013年1月15日 下午 12:33
  • 類似這樣吧

    Dim dbconn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=TAG.mdb;User Id=admin;Password=;") dbconn.Open() Dim dbcmd As OleDbCommand = New OleDbCommand("select card_no, card_ID, card_Date, owner, card_tag, [Image] from card_info where card_ID= ?", dbconn) dbcmd.Parameters.Add("card_ID", OleDbType.VarChar).Value = Trim(Mid(TextBox1.Text, 1, 8)) Dim dbreader As OleDbDataReader dbreader = dbcmd.ExecuteReader Dim Length As Long = dbreader.GetBytes(5, 0, Nothing, 0, 0) Dim Buffer(Length) As Byte dbreader.GetBytes(5, 0, Buffer, 0, Length) dbreader.Close() dbconn.Close() Dim stream As New MemoryStream(Buffer) Dim image As Image = Image.FromStream(stream) stream.Flush() stream.Close() PictureBox1.Image = image



    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度

    2013年1月15日 下午 01:42
  • Alex_Lee大大

    真得感謝你的幫忙,我會再努力研究看看的!

    2013年1月16日 上午 11:46
  • Alex_Lee大大

    程式碼運行無誤,可是圖片卻沒有顯示出來在picturebox上

    請問 問題出在哪

    2013年1月16日 下午 02:26
  • 確定輸入的card_ID 有圖片


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度

    2013年1月17日 上午 11:46
  • 已確定在access 的欄位六有放置圖片(ole物件)

    但是還是沒有讀出圖片

    2013年1月18日 上午 07:35
  • 在dbReader = dbcmd.ExecuteReader後面加一行

    dbReader.Read


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度

    2013年1月19日 上午 09:21
  • 已確定在access 的欄位六有放置圖片(ole物件)

    但是還是沒有讀出圖片

    注意几点:

    1)图片转化成Bytes:File.ReadAllBytes(图片路径)

    2)数据库字段类型Image。

    3)图片读出:SqlDataReader的dr[0]强制转换成byte数组,然后使用MemoryStream构造函数加载这个数组,最后使用Image.FromStream显示。


    帮助一起改进论坛质量?提交你的意见于此。
    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    2013年1月20日 上午 07:01
  • 你有把 Image 物件指給 PictureBox 嗎?

    T.L. Cheng

    2013年1月26日 上午 10:05
    版主
  • 感謝大大們的幫忙 

      我還是無法顯示圖片,

      請問樓上幾位大大,這個程式碼該如何修改


    Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
    
            Dim dbconn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=TAG.mdb;User Id=admin;Password=;")
            dbconn.Open()
    
            Dim dbcmd As OleDbCommand = New OleDbCommand("select card_no, card_ID, card_Date, owner, card_tag, [Image] from card_info where card_ID= ?", dbconn)
            dbcmd.Parameters.Add("card_ID", OleDbType.VarChar).Value = Trim(Mid(TextBox1.Text, 1, 8))
            Dim dbreader As OleDbDataReader
            dbreader = dbcmd.ExecuteReader
            dbreader.Read()
            Dim Length As Long = dbreader.GetBytes(5, 0, Nothing, 0, 0)
            Dim Buffer(Length) As Byte
            dbreader.GetBytes(5, 0, Buffer, 0, Length)
            dbreader.Close()
            dbconn.Close()
    
            Dim stream As New MemoryStream(Buffer)
            Dim image As Image = image.FromStream(stream)
            stream.Flush()
            stream.Close()
            PictureBox1.Image = image
    
        End Sub


    • 已編輯 pig1989 2013年1月26日 下午 03:16
    2013年1月26日 下午 03:15
  • 讀取Access資料庫bitmap出現錯誤

    http://www.blueshop.com.tw/board/show.asp?subcde=BRD20121009193628QYJ&fumcde=BRD20121009193628QYJ

    1.請參考以上連結,類似嗎?

    2.圖檔請以程式的方式存入Access,圖檔存入若不正確,自然無法讀出。

    3.請把程式專案和Access檔壓縮上傳到網路空間如SkyDrive,讓網友下載測試,大家無法模擬您的環境...

    2013年1月27日 上午 12:59
  • 感謝回復大大的幫忙,

    我有把專案和access壓縮了,並上傳到SkyDrive:

    https://skydrive.live.com/redir?resid=BB15E25FB57B282C!170&authkey=!AJXUfvakbd30zFM

    access在CH6-2\bin\Debug\TAG

    Debug裡面也有兩張要顯示的圖

    2013年1月28日 下午 12:46
  • 資料庫裡 欄位名稱是 car_tag
    請把 select command 中的 card_tag 改成 car_tag

    另外 請嘗試學會自行 Debug..... 


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度

    2013年1月31日 上午 09:48
  • Image 欄位裡的資料 是 &H15 &H1C &H2D 開頭的

    跟 BMP / JPG /GIF 的 Header 都不同

    請確認 圖型的資料格式 


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度

    2013年1月31日 上午 10:02