이 문서에서는 파일을 저장할 필요 없이 데이터베이스에 저장된 이미지를 Windows Form의 PictureBox 컨트롤에 직접 복사하는 방법을 설명합니다.
원래 제품 버전: Visual C#
원래 KB 번호: 317701
요약
이 단계별 문서에서는 파일을 저장할 필요 없이 데이터베이스에 저장된 이미지를 Windows Form의 PictureBox 컨트롤에 직접 복사하는 방법을 설명합니다.
Visual Basic 6.0에서 이진 큰 개체 {BLOB) 데이터를 파일에 저장하는 중간 단계 없이 PictureBox 컨트롤의 데이터베이스에서 이미지를 표시하는 유일한 방법은 PictureBox를 ADO(ActiveX Data Objects) 데이터 컨트롤 또는 레코드 집합과 같은 데이터 원본에 바인딩하는 것입니다. LoadPicture 문에서 사용할 파일에 이미지를 저장하지 않고 프로그래밍 방식으로 BLOB을 컨트롤에 로드할 수 있는 방법은 없습니다(데이터 바인딩 없음).
이 문서에서는 기본 클래스의 MemoryStream 개체를 System.IO 사용하여 데이터베이스의 이미지 데이터를 PictureBox 컨트롤에 직접 복사합니다.
요구 사항
다음 목록에서는 필요한 권장 하드웨어, 소프트웨어, 네트워크 인프라 및 서비스 팩을 간략하게 설명합니다.
- 호환되는 Windows 운영 체제에 설치된 Visual Studio .NET
- SQL Server의 사용 가능한 인스턴스 또는 테스트에 사용할 수 있는 Access 데이터베이스
이 문서에서는 다음 항목에 익숙하다고 가정합니다.
- Visual C# .NET Windows Forms 애플리케이션
- 데이터베이스의 BLOB(Binary Large Object) 스토리지
- 데이터 액세스 ADO.NET
Sample
다음 구조를 사용하여 SQL Server 또는 Access 테이블을 만듭니다.
CREATE TABLE BLOBTest ( BLOBID INT IDENTITY NOT NULL, BLOBData IMAGE NOT NULL )Visual Studio .NET을 열고 새 Visual C# Windows 애플리케이션 프로젝트를 만듭니다.
도구 상자에서 기본 Form1에 PictureBox 및 단추 컨트롤 2개를 추가합니다.
TextFile to Database의Button1속성과 Database의TextButton2속성을 PictureBox로 설정합니다.양식의 코드 모듈 맨 위에 다음 using 문을 삽입합니다.
using System.Data.SqlClient; using System.IO; using System.Drawing.Imaging;public 클래스 Form1 바로 안에 데이터베이스 연결 문자열 대해 다음 선언을 추가합니다.
System.Windows.Forms.Form class선언 및 필요에 따라 연결 문자열 조정합니다.String strCn = "Data Source=localhost;integrated security=sspi;initial catalog=mydata";(데이터베이스에
Click파일)의Button1이벤트 프로시저에 다음 코드를 삽입합니다. 필요에 따라 파일 경로를 사용 가능한 샘플 이미지 파일로 조정합니다. 이 코드는 디스크(개체 사용FileStream)에서 배열로Byte이미지 파일을 읽은 다음 매개 변수가 있는 Command 개체를 사용하여 데이터베이스에 데이터를 삽입합니다.try { SqlConnection cn = new SqlConnection(strCn); SqlCommand cmd = new SqlCommand("INSERT INTO BLOBTest (BLOBData) VALUES (@BLOBData)", cn); String strBLOBFilePath = @"C:\blue hills.jpg";//Modify this path as needed. //Read jpg into file stream, and from there into Byte array. FileStream fsBLOBFile = new FileStream(strBLOBFilePath,FileMode.Open, FileAccess.Read); Byte[] bytBLOBData = new Byte[fsBLOBFile.Length]; fsBLOBFile.Read(bytBLOBData, 0, bytBLOBData.Length); fsBLOBFile.Close(); //Create parameter for insert command and add to SqlCommand object. SqlParameter prm = new SqlParameter("@BLOBData", SqlDbType.VarBinary, bytBLOBData.Length, ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, bytBLOBData); cmd.Parameters.Add(prm); //Open connection, execute query, and close connection. cn.Open(); cmd.ExecuteNonQuery(); cn.Close(); } catch(Exception ex) { MessageBox.Show(ex.Message); }(Database to PictureBox)의
Button2이벤트 프로시저에Click다음 코드를 삽입합니다. 이 코드는 데이터베이스의BLOBTest테이블에서 행을 검색DataSet하여 가장 최근에 추가한 이미지를 배열에Byte복사한 다음 개체에MemoryStream복사한 다음 PictureBox 컨트롤의 속성으로Image로드합니다MemoryStream.try { SqlConnection cn = new SqlConnection(strCn); cn.Open(); //Retrieve BLOB from database into DataSet. SqlCommand cmd = new SqlCommand("SELECT BLOBID, BLOBData FROM BLOBTest ORDER BY BLOBID", cn); SqlDataAdapter da = new SqlDataAdapter(cmd); DataSet ds = new DataSet(); da.Fill(ds, "BLOBTest"); int c = ds.Tables["BLOBTest"].Rows.Count; if(c>0) { //BLOB is read into Byte array, then used to construct MemoryStream, //then passed to PictureBox. Byte[] byteBLOBData = new Byte[0]; byteBLOBData = (Byte[])(ds.Tables["BLOBTest"].Rows[c - 1]["BLOBData"]); MemoryStream stmBLOBData = new MemoryStream(byteBLOBData); pictureBox1.Image= Image.FromStream(stmBLOBData); } cn.Close(); } catch(Exception ex) { MessageBox.Show(ex.Message); }F5 키를 눌러 프로젝트를 컴파일하고 실행합니다.
데이터베이스에 파일 단추를 클릭하여 하나 이상의 샘플 이미지를 데이터베이스에 로드합니다.
PictureBox 컨트롤에 저장된 이미지를 표시하려면 [Database to PictureBox] 단추를 클릭합니다.
PictureBox 컨트롤의 이미지를 데이터베이스에 직접 삽입하려면 세 번째 Button 컨트롤을 추가하고 이벤트 프로시저에
Click다음 코드를 삽입합니다. 이 코드는 PictureBox 컨트롤의 이미지 데이터를 개체로MemoryStream검색하고 배열에Byte복사MemoryStream한 다음 매개 변수가 있는 Command 개체를 사용하여 배열을 데이터베이스에 저장합니다Byte.try { SqlConnection cn = new SqlConnection(strCn); SqlCommand cmd = new SqlCommand("INSERT INTO BLOBTest (BLOBData) VALUES (@BLOBData)", cn); //Save image from PictureBox into MemoryStream object. MemoryStream ms = new MemoryStream(); pictureBox1.Image.Save(ms, ImageFormat.Jpeg); //Read from MemoryStream into Byte array. Byte[] bytBLOBData = new Byte[ms.Length]; ms.Position = 0; ms.Read(bytBLOBData, 0, Convert.ToInt32(ms.Length)); //Create parameter for insert statement that contains image. SqlParameter prm = new SqlParameter("@BLOBData", SqlDbType.VarBinary, bytBLOBData.Length, ParameterDirection.Input, false, 0, 0,null, DataRowVersion.Current, bytBLOBData); cmd.Parameters.Add(prm); cn.Open(); cmd.ExecuteNonQuery(); cn.Close(); } catch(Exception ex) { MessageBox.Show(ex.Message); }프로젝트를 실행합니다. PictureBox에 데이터베이스 단추를 클릭하여 이전에 저장된 이미지를 PictureBox 컨트롤에 표시합니다. 새로 추가된 단추를 클릭하여 PictureBox의 이미지를 데이터베이스에 저장합니다. 그런 다음, 그림 상자로 데이터베이스 단추를 다시 클릭하여 이미지가 올바르게 저장되었는지 확인합니다.
함정
이 테스트는 Access 및 SQL Server와 함께 배포된 샘플 Northwind 데이터베이스의 Employees 테이블의 Photo 열에서 작동하지 않습니다. 사진 열에 저장된 비트맵 이미지는 Visual Basic 6.0 OLE 컨테이너 컨트롤에서 만든 헤더 정보로 래핑됩니다.
Access 데이터베이스를 사용하여 이 코드를 테스트해야 하는 경우 Access 테이블에서 OLE 개체 형식으로 열을 만들고 네임스페이스 대신 Jet 4.0 공급자와 함께 네임스페이
System.Data.SqlClient스를 사용해야System.Data.OleDb합니다.