none
讀取存入SQLSERVER2005內的圖片 RRS feed

  • 問題

  • 小弟問題是這樣的

    我把圖片存到SQL2005裡面(如下,不知道對不對,我看資料庫的IMAGE欄位裡面有出現<二進位資料>,應該有寫入成功)
    寫入程式碼如下

    '直接存圖檔
    
        Dim fileName1 As String = "D:\R1.jpg"
        Dim bufByte() As Byte = Nothing
    
        Try
    
          Using fs1 As FileStream = New FileStream(fileName1, FileMode.Open)
    
            If (File.Exists(fileName1)) Then
    
              Using br As BinaryReader = New BinaryReader(fs1)
    
                Dim size As Long = br.BaseStream.Length
                ReDim bufByte(size)
                bufByte = br.ReadBytes(Integer.Parse(size))
    
    
                Using conn As New SqlConnection(My.Settings.Setting)
    
                  Dim str As String = ""
                  conn.Open()
    
                  'str += " Insert into Files "
                  str += " Insert into IMG "
                  'str += " (FileName ,FileData) "
                  str += " (PicTime,PhotoIMG) "
                  str += " Values (@Name,@IMG) "
    
                  Dim cmd As New SqlCommand(str, conn)
    
                  cmd.Parameters.AddWithValue("@Name", ("R1"))
                  cmd.Parameters.AddWithValue("@IMG", (bufByte))
    
                  Dim Dr As SqlDataReader = cmd.ExecuteReader() '寫入
    
                  MessageBox.Show("存檔成功", "MSG")
                End Using
    
    
                br.Close()
              End Using
    
              fs1.Close()
    
            End If
    
    
          End Using
    
        Catch ex As Exception
    
        End Try
    

    目前小弟要把她取出來,但是不知道該如何取....(像是用讀取數據的方式?...還是有其他

    還請各位高手指導一下小弟了~謝謝!

    2010年11月1日 上午 06:37

解答

所有回覆

  • 回JOE Hung

    把資料庫裡面的圖讀出來,是用Insert還是用Select?

    順便一提我資料庫欄位是這樣的

    No, PicTime , PhotoIMG 分別為 編號(int),名稱(Varchar),圖(image)

    目前我是想把存進去的圖抓出來,顯示在PctureBox上...

    但是不知道該怎抓.........

    2010年11月1日 上午 06:52
  • 1. 圖讀出來用 SELECT

    2. 參考余小章的文章 [ADO.NET] 如何 讀取 SQL 資料庫的 二進位圖檔


    歡迎參觀我的Blog.NET菜鳥自救會
    • 已標示為解答 circle3 2010年11月2日 上午 02:57
    2010年11月1日 上午 06:57
    版主
  • (1) Select 語法
    (2) Joe 給的討論串 你看過了嗎? 
         最下面就有 範例 把資料顯示在 pictureBox上


    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

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

    在標題或文章註明很急
    不會增加網友回覆速度
    2010年11月1日 上午 07:04
  • 回Alex_Lee

    Dim Bytes As Byte() = yy.Rows(0).Item("ProP")
        Dim mStream As New IO.MemoryStream
        mStream.Write(Bytes, 0, Bytes.Length)
        Dim Img As New Bitmap(mStream)
        PictureBox1.Image = Img
        PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
        mStream.Flush()
    
    
    

    有看過了他如何放入PictureBox,只是上面我不太知道如何從SQLSERVER取出...

    目前我只做到..底下..

    Using conn As New SqlConnection(My.Settings.Setting1)
    
          Dim str As String = ""
    
          str += " Select IMG From PhotoIMG Where No = @No "
    
          Using cmd As New SqlCommand(str, conn)
    
            cmd.Parameters.AddWithValue("@No", ("1"))
            conn.Open()
    
            Using dr1 As SqlDataReader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)
              dr1.Read()
              Using ms As New MemoryStream()
                'DataBytes = dr1.GetBytes(0, StartIndex, BinaryBytes, 0, BufferSize)
                'While DataBytes > 0
                '  ms.Write(BinaryBytes, 0, BufferSize)
                '  StartIndex += BufferSize
                '  DataBytes = dr1.GetBytes(0, StartIndex, BinaryBytes, 0, BufferSize)
                'End While
                'pictureBox1.Image = new Bitmap(ms);
                pictureBox1.Image = Bitmap.FromStream(ms)
              End Using
    
    
    
            End Using
    
          End Using
    
        End Using
    

    只是在 Using dr1 As SqlDataReader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)

    出現  無效的物件名稱 'PhotoIMG'。

    讓我十分困擾....

    2010年11月1日 上午 07:28
  • 請教一下各位高手,是不是小弟最上面的把圖片存入SQL_SERVER出了問題...

    還是其他原因....?

    我有開啟資料表內容看...PhotoIMG這欄位的內容顯示    <二進位資料>

    2010年11月1日 上午 07:39
  •    str += " Select PhotoIMG From IMG Where No = @No "
    
    IMG是table吧...
    2010年11月1日 上午 07:57
  • 恩!在下剛剛也發現了...真是不好意思^^"

    圖是有查出來了...不過PictureBox顯示,只顯示出原圖的左上角的一個小角落....並沒有整個顯示出來..

    是我Select那裏有出了甚麼問題嗎?

    底下為取出圖片的程式碼

     Using conn As New SqlConnection(My.Settings.Setting1)
    
          Dim str As String = ""
    
          str += " Select PhotoIMG From IMG Where No = @No "
    
          Using cmd As New SqlCommand(str, conn)
    
            cmd.Parameters.AddWithValue("@No", ("5"))
            conn.Open()
    
            Using dr1 As SqlDataReader = cmd.ExecuteReader( CommandBehavior.SequentialAccess)
              dr1.Read()
              Using ms As New MemoryStream(BinaryBytes, 0, BinaryBytes.Length, True)
                DataBytes = dr1.GetBytes(0, StartIndex, BinaryBytes, 0, BufferSize)
                'While DataBytes > 0
                '  'ms.Write(BinaryBytes, 0, BufferSize)
                '  StartIndex += BufferSize
                '  DataBytes = dr1.GetBytes(0, StartIndex, BinaryBytes, 0, BufferSize)
                'End While
                'PictureBox1.Image = New Bitmap(ms)
                PictureBox1.Image = Bitmap.FromStream(ms)
              End Using
    
            End Using
    
          End Using
    
        End Using
    

    我將While DataBytes > 0 到 'End While 這範圍註解...圖檔指出現一小角落沒有完全呈現

    若我將註解拿掉,則會出現  記憶體資料流是不可擴展的。

    再次請教各位高手....如何讓圖檔完全呈現...若順利呈現....需不需要做哪些釋放資源的動作.....?

    2010年11月1日 上午 08:14
  • 多謝各位指導!

    目前小弟已經找出問題...原來是我BufferSize設太小...

    那小弟該如何做一些釋放資源的動作

    順帶一提,我整支程式會從資料庫裡面一直抓最新的圖,然後用Timer去跑(1秒更新1張),然後呈現在PictureBox

    請問小弟的做法有沒有不妥的...?

    還請各位高手指導一下觀念了!!~謝謝

     

    2010年11月1日 上午 09:10
  • 多謝各位高手的指導~小弟收穫良多!

    2010年11月2日 上午 02:58