2013-11-15 1 views
1

Visual Studio 2010에서 내 액세스 데이터베이스의 데이터에 액세스하는 C# 프로그램이 있습니다. 나는 이미지를 제외한 모든 정보를 얻을 수있다. 나는 here 단계를 따라 사진을 액세스 데이터베이스에 임베드했다.Access 데이터베이스에서 C# 프로그램으로 비트 맵 이미지 가져 오기

Right-click the first field in the Image column of the table and click Insert Object. 
Click Create from File, and then click Browse. 
Browse to one or more Windows Bitmap (.bmp) or Device Independent Bitmap (.dib) images.  
You can find a set of BMP files, named Empid1.bmp through Empid9.bmp, at 
drive:\Program Files\Microsoft Office\OFFICE11\SAMPLES. Select the first image and click OK. 

내 비트 맵 이미지의 위치를 ​​사용했습니다. 비트 맵 특성을 포함하는 생성자가 있지만 모든 정보를 얻기 위해 테이블로 이동하려고하면 "System.Drawing.Bitmap에 System.Byte []의 객체를 캐스팅 할 수 없습니다."라는 오류가 발생합니다. 이미지가 시스템 바이트로 저장된다고 말하는 이유가 확실하지 않습니다.

발견 this 스레드. 그래서 메모리 스트림을 시도했지만 같은 문제가 system.io.memorystream 시스템 바이트를 변환 할 수 없습니다.

답변

0

당신이 OLE 개체에 새겨 져 이미지를 저장합니다 Access 데이터베이스에 비트 맵 이미지를 삽입하기위한 귀하의 질문에 설명하는 절차. C# 프로그램의 비트 맵 이미지를 사용하려면 Access에서 검색 한 이진 데이터에서 OLE "래퍼"를 제거해야합니다. 예를 들어

, 나는 Access 데이터베이스에서 검색하고 새로운 Bitmap 객체로 직접 변환하려고하면 ...

private void Form1_Load(object sender, EventArgs e) 
{ 
    using (var con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Public\Database1.accdb;")) 
    { 
     con.Open(); 
     using (var cmd = new OleDbCommand("SELECT LastName, FirstName, Photo FROM Clients WHERE ID=3", con)) 
     { 
      OleDbDataReader rdr = cmd.ExecuteReader(); 
      rdr.Read(); 
      this.textBox1.Text = rdr["FirstName"].ToString(); 
      this.textBox2.Text = rdr["LastName"].ToString(); 
      byte[] photoBytes = (byte[])rdr["Photo"]; 
      var ms = new System.IO.MemoryStream(photoBytes); 
      this.pictureBox1.Image = new System.Drawing.Bitmap(ms); 
      ms.Close(); 
     } 
     con.Close(); 
    } 
} 

... 나는 오류 "매개 변수가 유효하지 않습니다"얻을 :

Parameter.png

그러나, 나는 내 다른 대답 here ...에 OleImageUnwrap 클래스의 GetImageBytesFromOLEField 방법을 사용하여 OLE "래퍼"를 제거하면

var ms = new System.IO.MemoryStream(OleImageUnwrap.GetImageBytesFromOLEField(photoBytes)); 

는 ... 그것은 작동합니다

Hank.png

+0

picturebox.Image의 경우 필요한 네임 스페이스와 참조는 무엇입니까? 그것은 이미지에 대한 정의를 찾을 수 없다고 말합니다. system.windows.controls.listbox라고 생각했지만 system.windows.controls의 네임 스페이스 공간 또는 참조를 사용하여 컨트롤 부분에 연결할 수 없습니다. –

+0

@ user2781018'PictureBox.Image'는'System.Windows.Forms'의 일부입니다 (ref : [here] (http://msdn.microsoft.com/en-us/library/system.windows.forms.picturebox.image). % 28v = vs.110 % 29.aspx)). –

+0

나는 바보 야. 그림 상자를 사용하지 않았습니다. 감사. 이제 작동 중입니다. 그 방법을 쓰기까지 얼마나 걸렸습니까? 나는 그것이 헤더를 벗긴다는 것을 안다. 그러나 나는 그것을 쓸 수있는 기회가 없다. 다시 한번 감사드립니다. –

0

바이트 배열에서 메모리 스트림을 만들 수 있으며 메모리 스트림에서 이미지를 만들 수 있습니다. 다음 코드는 컴파일 :

byte[] bytes = new byte[0]; 
MemoryStream ms = new MemoryStream(bytes); 
Image img = Image.FromStream(ms); 
+0

것은 내가 배열에 데이터베이스에서 입력 데이터를 생성자 클래스를 사용하고 있다는 점이다. 그래서 나는 그 상황에서 위의 것을 어떻게 사용할 것인지 잘 모르겠습니다. 내 그림 속성을 memoryStream 대신 바이트로 변경했지만 오류가 발생하여 지정된 캐스트가 유효하지 않습니다. –