2011-02-17 105 views
0

我有一段时间找到一个适用于此的代码片段。我已经到了它出现的地步,通过使用这段代码将图片存储为blob(可能不正确)。VB.net - 从MySQL插入/检索图片数据库直接进入/从一个Picturebox

Dim filename As String = txtName.Text + ".jpg" 
    Dim FileSize As UInt32 
    Dim ImageStream As System.IO.MemoryStream 



    ImageStream = New System.IO.MemoryStream 
    PbPicture.Image.Save(ImageStream, System.Drawing.Imaging.ImageFormat.Jpeg) 
    ReDim rawdata(CInt(ImageStream.Length - 1)) 
    ImageStream.Position = 0 
    ImageStream.Read(rawdata, 0, CInt(ImageStream.Length)) 
    FileSize = ImageStream.Length 

    Dim query As String = ("insert into actors (actor_pic, filename, filesize) VALUES (?File, ?FileName, ?FileSize)") 
    cmd = New MySqlCommand(query, conn) 
    cmd.Parameters.AddWithValue("?FileName", filename) 
    cmd.Parameters.AddWithValue("?FileSize", FileSize) 
    cmd.Parameters.AddWithValue("?File", rawData) 

    cmd.ExecuteNonQuery() 

    MessageBox.Show("File Inserted into database successfully!", _ 
    "Success!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk) 

而是使用下面的代码retieving到PictureBox的:在该地区

Private Sub GetPicture() 
    'This retrieves the pictures from a mysql DB and buffers the rawdata into a memorystream 

    Dim FileSize As UInt32 
    Dim rawData() As Byte 

    Dim conn As New MySqlConnection(connStr) 


    conn.Open() 
    conn.ChangeDatabase("psdb") 


    Dim cmd As New MySqlCommand("SELECT actor_pic, filesize, filename FROM actors WHERE actor_name = ?autoid", conn) 
    Cmd.Parameters.AddWithValue("?autoid", Actor1Box.Text) 

    Reader = cmd.ExecuteReader 
    Reader.Read() 

    'data is in memory 

    FileSize = Reader.GetUInt32(Reader.GetOrdinal("filesize")) 
    rawData = New Byte(FileSize) {} 

    'get the bytes and filesize 

    Reader.GetBytes(Reader.GetOrdinal("actor_pic"), 0, rawData, 0, FileSize) 

    Dim ad As New System.IO.MemoryStream(100000) 
    ' Dim bm As New Bitmap 

    ad.Write(rawData, 0, FileSize) 

    Dim im As Image = Image.FromStream(ad) * "error occurs here" (see below) 
    Actor1Pic.Image = im 


    Reader.Close() 


    conn.Close() 
    conn.Dispose() 

    ad.Dispose() 

我得到的错误“参数无效”指出。仅供参考如果任何人甚至有比这更好的(工作)代码例子,我可以插入与调试这个混乱,这将是很好的。

+0

昏暗的广告作为新System.IO.MemoryStream() – dMO 2011-02-17 22:35:10

回答

1

好,因为得不到帮助我摆脱了这个问题,并最终得到它的工作。这是我的工作代码。

保存到MySQL出的PictureBox(pbPicture)的从MySQL

Dim filename As String = txtName.Text + ".jpg" 
    Dim FileSize As UInt32 

    conn.Close() 

    Dim mstream As New System.IO.MemoryStream() 
    PbPicture.Image.Save(mstream, System.Drawing.Imaging.ImageFormat.Jpeg) 
    Dim arrImage() As Byte = mstream.GetBuffer() 

    FileSize = mstream.Length 
    Dim sqlcmd As New MySqlCommand 
    Dim sql As String 
    mstream.Close() 

    sql = "insert into [your table] (picture, filename, filesize) 
           VALUES(@File, @FileName, @FileSize)" 

    Try 
     conn.Open() 
     With sqlcmd 
      .CommandText = sql 
      .Connection = conn 
      .Parameters.AddWithValue("@FileName", filename) 
      .Parameters.AddWithValue("@FileSize", FileSize) 
      .Parameters.AddWithValue("@File", arrImage) 

      .ExecuteNonQuery() 
     End With 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    Finally 
     conn.Close() 
    End Try 

LOAD DB返回的PictureBox

Dim adapter As New MySqlDataAdapter 
    adapter.SelectCommand = Cmd 

    data = New DataTable 

    adapter = New MySqlDataAdapter("select picture from [yourtable]", conn) 

注意!只能放一次画中画的PictureBox所以obvoiusly这个查询只能返回一个记录你

commandbuild = New MySqlCommandBuilder(adapter) 
    adapter.Fill(data) 

    Dim lb() As Byte = data.Rows(0).Item("picture") 
    Dim lstr As New System.IO.MemoryStream(lb) 
    PbPicture.Image = Image.FromStream(lstr) 
    PbPicture.SizeMode = PictureBoxSizeMode.StretchImage 
    lstr.Close() 
0

如果切换会发生什么这样的:

Dim ad As New System.IO.MemoryStream(100000) 

到:

Dim ad As New System.IO.MemoryStream() 

编辑

VB数组的大小也比其他编程语言不同,我认为你需要做的a减1:

rawData = New Byte(FileSize - 1) {} 

EDIT 2

好吧,让我们来看看对你有什么原始二进制数据。所有JPG应以FFD8开始并以FFD9结尾。在设置rawData阵列后插入以下内容。如果它抛出一个错误,那么你的JPEG信息已损坏。

If (rawData(0) = &HFF) AndAlso (rawData(1) = &HD8) Then 
     Trace.WriteLine("File start OK") 
    Else 
     Throw New ApplicationException("Invalid jpg header") 
    End If 

    If (rawData(rawData.Length - 2) = &HFF) AndAlso (rawData(rawData.Length - 1) = &HD9) Then 
     Trace.WriteLine("File end OK") 
    Else 
     Throw New ApplicationException("Invalid jpg footer") 
    End If 

编辑3

我们将要看到的数据的前几个字节的样子。运行这个并发布什么得到输出:

For I = 0 To 20 
     Trace.Write(Convert.ToString(rawData(I), 16).ToUpperInvariant()) 
    Next 
+0

同样的错误昏暗的广告作为新System.IO.MemoryStream()同样的错误 – dMO 2011-02-22 14:58:37

1

好,您正在尝试当“Image.FromStream”期待System.IO.Stream

投类型的MemoryStream
1

我刚写了这段代码,作为我对这个论坛的贡献的一部分,虽然不是会员但是很乐意帮忙。 当您继续搜索记录而不是搜索一条记录并关闭应用程序以再次搜索时,此代码会搜索多条记录及其相应的图像。此代码可让您搜索记录,清除输入搜索条件的字段并再次搜索&。

If TextBox3.Text = "" Then ' This is the search field to be used it could be any field from your database that will match the value from the database. Either firstname, phone or email etc 
     MsgBox("Nothing to search for from the database", MsgBoxStyle.OkOnly + MsgBoxStyle.Exclamation, "Oop!") 
    End If 
    Try 
     conn.Open() 
     Dim data As New MySqlDataAdapter("SELECT * FROM users_data WHERE phoneno = '" & TextBox3.Text & "' ", conn) 

     Dim dTable As New DataTable 
     data.Fill(dTable) 

     If dTable.Rows.Count > 0 Then 
      TextBox1.Text = dTable.Rows(0).Item("firstname") 
      TextBox2.Text = dTable.Rows(0).Item("lastname") 

      'Fetching the corresponding image to this member 
      Dim arrImage As Byte() 
      Dim myMS As New IO.MemoryStream 
      If Not IsDBNull(dTable.Rows(0).Item("myimage")) Then 
       arrImage = dTable.Rows(0).Item("myimage") 
       For Each ar As Byte In arrImage 
        myMS.WriteByte(ar) 
       Next 
       PictureBox1.Image = System.Drawing.Image.FromStream(myMS) 
      End If 

     Else 
      MsgBox("No record found for this Phone No: " & TextBox3.Text & " Enter a valid Phone No or consult the Admin Manager", MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "Record not found") 
      clear() 
     End If 
    Catch ex As Exception 
     MsgBox(ex.Message) 
     Exit Sub 
    Finally 
     conn.Close() 
    End Try 

此代码也可以用于MYSQL服务器数据库和Microsoft SQL数据库。唯一不同的是正在改变这一声明昏暗的数据作为新个MySqlDataAdapter这是MySQL服务器昏暗的数据作为新的SqlDataAdapter为Microsoft SQL Server。晚上好所有StackOverflowers

相关问题