none
將Access資料表內的ole物件顯示在PictureBox內 RRS feed

  • 問題

  •  

    請問前輩

    要如何才能將Access資料表內的ole物件顯示在PictureBox內。

    已經有參考章立民老師所出的『Visual C# 2005檔案IO與資料存取秘訣』一書內的第七章

    但在MSDN下找不到相對應的oledbType

    感謝前輩們的指教,謝謝

     

    os Vista

    vs 2008

    database Access2007

    C#

     

     

    try
                {
                    if (namenListBox.SelectedIndex == -1)
                    {
                        return;
                    }

     

                    OleDbConnection pubsConn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\SDatabase.accdb;Persist Security Info=False;");


                    OleDbCommand logoCMD = new OleDbCommand("select cflag from Sdb", pubsConn);

     

                    logoCMD.Parameters.Add("@count", OleDbType.VarChar, 255).Value = namenListBox.SelectedIndex.ToString();

     

                    pubsConn.Open();

     

                    using (OleDbDataReader myreader = logoCMD.ExecuteReader(CommandBehavior.SequentialAccess))
                        {
                            if (myreader.Read())
                            {
                                //System.Data.SqlTypes.SqlBytes byt = myreader.GetSqlBytes(0);

                                //試著改為System.Data.OleDb.OleDbType,但找不到相對應的方法

                                cflagPictureBox.Image = Image.FromStream(byt);

     

                                //如果改成以下的寫法時,則會出現錯誤訊息
                                //byte[] bin = new byte[(int)(myreader.GetBytes(0, 0, null, 0, Int32.MaxValue))];

                                //myreader.GetBytes(0, 0, bin, 0, bin.Length);

                                //using (MemoryStream stmBdata = new MemoryStream(bin))
                                //{
                                //    cflagPictureBox.Image = Image.FromStream(stmBdata); //〞參數無效〞
                                //}

     

                                namenTextBox.Text = myreader.GetString(1);


                            }
                        }
                   
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }

    2008年2月19日 上午 09:33

解答

  • JPG 的 HEX 是以 FF D8 FF 開頭...也可以拿來算 offset

    private
    void button3_Click(object sender, EventArgs e)
    {
        string strConn = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\1.accdb;Persist Security Info=True";
        OleDbConnection conn = new OleDbConnection(strConn);
        OleDbCommand cmd = new OleDbCommand("SELECT Image FROM testTable", conn);
     
        OleDbDataAdapter da = new OleDbDataAdapter(cmd);
        DataTable dt = new DataTable();
        da.Fill(dt);
     
        foreach (DataRow dr in dt.Rows)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                byte[] ImageData = (byte[]) dr["Image"];
     
                int offset = 0;
                for (int j = 0; j < ImageData.Length - 2; j++)
                {
                    if (ImageData[j] == 255 && ImageData[j + 1] == 216 && ImageData[j + 2] == 255)
                    {
                        offset = j;
                        break;
                    }
                }
     
                ms.Write(ImageData, offset, ImageData.Length - offset);
                Image img = Image.FromStream(ms);
     
                pictureBox1.Image = img;
                Application.DoEvents();
            }
     
            Thread.Sleep(2000);
        }
    }

    2008年2月20日 上午 11:29

所有回覆

  • 我自己使用 Access 2007 來實驗建立一個 testTable 內有欄位 Image 型態 Ole 物件...
    如果 Ole 物件是存放 JPG 圖片...則下列程式碼可執行...
    ( 是 JPG 圖片,要有 174 byte 的 Offset,JPG: 174、BMP: 150、PNG: 156、GIF: 156 )

    private void button3_Click(object sender, EventArgs e)
    {
        string strConn = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\1.accdb;Persist Security Info=True";
        OleDbConnection conn = new OleDbConnection(strConn);
        OleDbCommand cmd = new OleDbCommand("SELECT Image FROM testTable", conn);
     
        OleDbDataAdapter da = new OleDbDataAdapter(cmd);
        DataTable dt = new DataTable();
        da.Fill(dt);
     
        using (MemoryStream ms = new MemoryStream())
        {
            byte[] ImageData = (byte[]) dt.Rows[5]["Image"];
            ms.Write(ImageData, 174, ImageData.Length - 174);
            Image img = Image.FromStream(ms);
     
            pictureBox1.Image = img;
        }
    }


    2008年2月20日 上午 01:30
  •  

    還是不行

    Image img = Image.FromStream(ms);   //參數無效

    2008年2月20日 上午 02:14
  • JPG 的 HEX 是以 FF D8 FF 開頭...也可以拿來算 offset

    private
    void button3_Click(object sender, EventArgs e)
    {
        string strConn = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\1.accdb;Persist Security Info=True";
        OleDbConnection conn = new OleDbConnection(strConn);
        OleDbCommand cmd = new OleDbCommand("SELECT Image FROM testTable", conn);
     
        OleDbDataAdapter da = new OleDbDataAdapter(cmd);
        DataTable dt = new DataTable();
        da.Fill(dt);
     
        foreach (DataRow dr in dt.Rows)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                byte[] ImageData = (byte[]) dr["Image"];
     
                int offset = 0;
                for (int j = 0; j < ImageData.Length - 2; j++)
                {
                    if (ImageData[j] == 255 && ImageData[j + 1] == 216 && ImageData[j + 2] == 255)
                    {
                        offset = j;
                        break;
                    }
                }
     
                ms.Write(ImageData, offset, ImageData.Length - offset);
                Image img = Image.FromStream(ms);
     
                pictureBox1.Image = img;
                Application.DoEvents();
            }
     
            Thread.Sleep(2000);
        }
    }

    2008年2月20日 上午 11:29
  • 感謝前輩的指教!!! 

    終於可以正確的顯示所選擇的圖示了

     

    想再請問前輩

    關於圖檔的HEX資訊要至那查詢???

     

    謝謝

    2008年2月21日 上午 07:12
  • 可以用 Ultraedit 或是 Notepad++ 的16 進位模式檢視就可以了...

    BMP: 42 4D 36
    JPG: FF D8 FF
    GIF: 47 49 46
    PNG: 89 50 4E

    2008年2月21日 下午 04:45
  • 請問一下JPG: 174、BMP: 150、PNG: 156、GIF: 156代表什麼意思?為什麼JPG:174??是固定嗎?又為什麼BMP:150??
    Thanks.

    2009年2月18日 下午 12:20