- 1 - ADO.NET & XML & LINQ 이현정 hjyi@hotmail.com MCT/MCSD/MCAD/MCSD.NET
- 2-20장데이터베이스와 ADO.NET 데이터베이스에대하여 관계형데이터베이스의기본적인구조 SQL(Structured Query Langauge) DBMS ADO.NET ADO.NET의구성 System.Data Data Provider DataSet 클래스 21장 ADO.NET과함꼐하는 MyFriends 프로젝트
- 3 - ADO.NET ADO.NET 개요 DataSet 사용하기 DataReader 사용하기 저장프로시저사용하기
ADO.NET 개요 - 4-1. Microsoft SQL Server 2005 Express 설치 2. 관계형데이터베이스의기초 3. ADO.NET 개요 3.1 ADO.NET 객체모델 3.2.NET Data Provider란? 3.3 DataSet 이란? 3.4 DataSets과 DataReaders 4. Visual C# 2005 Windows 응용프로그램에서데이터사용하기 4.1 데이터소스구성마법사 4.2 데이터소스창
1. Microsoft SQL Server 2005 Express 설치 - 5 - Visual C# 2005 Express Edition 설치시같이설치됨 SQL Server 2005 Express Edition http://www.microsoft.com/korea/msdn/vstudio/express/sql/ SQL Server Management Studio Express 설치해야됨 http://www.microsoft.com/korea/msdn/vstudio/express/sql/download/ SQL Server 2000 Sample Databases 설치해야됨 http://www.microsoft.com/downloads/details.aspx?familyid=06616212-0356-46a0-8da2-eebc53a68034&displaylang=en
Record 2. 관계형데이터베이스의기초 Table Base Shapes Shape# Center.x Center.y Pen Style... Ellipses Shape# Major Minor Triangles Shape# V1.x V1.y Rectangles Shape# Width Height... - 6 - Primary Key 기본키 Field=Column Relation - Join Foreign Key 외래키
2. 관계형데이터베이스의기초 - 7 - Pubs Sample DB- Microsoft SQL Server 2000
2. 관계형데이터베이스의기초 - 8 - 기본 SQL문 DDL(Data Definition Language) CREATE object_name ALTER object_name DROP object_name CREATE DATABASE Northwind ON default = 256 USE northwind CREATE TABLE customer (cust_id int, company varchar(40), contact varchar(30), phone char(12) ) GO
2. 관계형데이터베이스의기초 - 9 - 기본 SQL문 DML(Data Manipulation Language ) SELECT INSERT UPDATE DELETE USE northwind SELECT categoryid, productname, productid, unitprice FROM products INSERT INTO customer (cust_id, company, contact, phone) VALUES (1,'HP','Manager','34702114') UPDATE customer SET company = 'AAA' WHERE cust_id = 1 DELETE FROM sales WHERE DATEDIFF(Year,ord_date,GETDATE()) >= 3
3. ADO.NET 개요 - 10 - 데이터베이스연결하는사용하는클래스들 ADO(Active Data Object) 의다음버전 Disconnected 환경에초점 네임스페이스 System.Data System.Data.SqlClient System.Data.OleDb System.Data.OracleClient System.Data.Odbc System.Common System.Data.SqlTypes 설명 DataSet, DataTable, DataRow 등의중요클래스들을가지고있다. NET Framework Data Provider for SQL Server는 SQL Server에있는데이터를사용하는데필요한클래스들을가지고있다. NET Framework Data Provider for OLE DB는 OLE DB Provider를사용하여 OLE DB 데이터를액세스하는데필요한클래스를가지고있다..NET Framework Data Provider for Oracle은 Oracle 8.1.7 이상의 Oracle 데이터소스를사용하는데필요한클래스들을가지고있다..NET Framework Data Provider for ODBC는관리되는공간의 Driver를사용하여데이터에액세스하는데사용되는클래스를가지고있다..NET Data Provider에의해공유된클래스가있다. SQL Server 에서사용되는고유데이터타입들을가지고있다.
3.1 ADO.NET의구성 (p383) - 11 - 데이터베이스.NET Data Provider Connection Transaction Command Parameters DataReader DataAdapter SelectCommand InsertCommand UpdateCommand DeleteCommand DataSet DataTable DataRowCollection DataColumnCollection
3.2.NET Data Provider 란? - 12 - 데이터베이스 데이터베이스와의연결을관리한다 Connection 데이터베이스쿼리를수행한다 Command DataAdapter DataReader 데이터집합 (Data Set) 과데이터베이스와의데이터를교환한다읽기전용데이터를효율적으로사용할수있게해준다
3.3 DataSet 이란? - 13 - DataSet Tables DataTable Relations Columns DataColumn Constraints Rows DataRelation Constraint DataRow Object DataSets은하나또는여러개의테이블과관계로이루어짐 In-memory Cache of Data 하나또는여러개의 Data Adapter 로부터생성됨 XML 로부터생성됨 다른 DataSets 으로부터생성됨 Tables은 Columns, Constraints, 와 Rows로구성됨 모두다 Collection 임!!! Collection
3.4 DataSets 과 DataReaders - 14 - DataSet DataReader 데이터를읽고쓰기가가능 서로다른데이터베이스에서여러개의테이블들로구성할수있음 비연결 여러개의컨트롤에바인딩가능 데이터를앞으로 (Forward), 뒤로 (Backward) 읽을수있다 접근속도가느리다 Visual Studio.NET 도구를사용 읽기전용 하나의데이터베이스에서하나의 SQL 문을수행해서생성 연결 하나의컨트롤에만바인딩가능 앞으로만 (Forward-only) 접근속도가빠르다 일일이코딩해야함
- 15-4. Visual C# 2005 Windows 응용프로그램에서데이터사용하기 IDE 특징 데이터소스구성마법사 데이터소스창 DataSet 디자이너 새로추가되거나향상된컴포넌트와컨트롤들 BindingSource 컨트롤 DataGridView 컨트롤 Typed DataSets과 Typed DataAdapters(TableAdapter)
4.1 데이터소스구성마법사 - 16 - 데이터메뉴에서새데이터소스추가 데이터창에서새테이터소스추가
4.2 데이터소스창 - 17 - 테이블이나컬럼을폼위로드래깅 사용자가선택한 UI 컨트롤을생성 DataGridView 컨트롤을생성 각컨트롤을생성
DataSet 사용하여데이터베이스연결하기 - 18-1 ADO.NET 객체모델 1.1.NET Data Provider란? 1.2 DataSet 이란? 2. DataSet 사용하기 2.1 데이터베이스연결하기 2.2 DataSets 생성하기 2.3 DataSet으로부터데이터베이스수정하기 3. DataView 사용하기 4. XML 데이터바인딩하기
1 ADO.NET 객체모델 - 19 - 데이터베이스.NET Data Provider Connection Transaction Command Parameters DataReader DataAdapter SelectCommand InsertCommand UpdateCommand DeleteCommand DataSet DataTable DataRowCollection DataColumnCollection
1.1.NET Data Provider 란? - 20 - 데이터베이스 데이터베이스와의연결을관리한다 Connection 데이터베이스쿼리를수행한다 Command DataAdapter DataReader 데이터집합 (Data Set) 과데이터베이스와의데이터를교환한다읽기전용데이터를효율적으로사용할수있게해준다
1.2 DataSet 이란? - 21 - DataSet Tables DataTable Relations Columns DataColumn Constraints Rows DataRelation Constraint DataRow Object DataSets은하나또는여러개의테이블과관계로이루어짐 In-memory Cache of Data 하나또는여러개의 Data Adapter 로부터생성됨 XML 로부터생성됨 다른 DataSets 으로부터생성됨 Tables은 Columns, Constraints, 와 Rows로구성됨 모두다 Collection 임!!! Collection
2. DataSet 사용하기 - 22 - Visual C# 2005 데이터소스창 Coding Connection DataAdapter - Command DataSet
2.1 데이터베이스연결하기 - 23 - SqlConnection 사용 SqlConnection mysqlconnection = new SqlConnection( data source=.\\sqlexpress;initial catalog=northwind; + Integrated security=true"); OleDbConnection 사용 OleDbConnection myoledbconnection = new OleDbConnection( provider=sqloledb; + data source=localhost;initial catalog=northwind; + initial catalog=true ); Data Source 서버이름 Initial catalog 데이터베이스이름 SQL Server 인증 - Windows 인증 Integrated security = TRUE or SSPI - Mixed 인증 User ID=sa;Password=password
2.2 DataSets 생성하기 - 24 - Client SelectCommand Server DataSet DataAdapter Data DataTable Fill Update Database Data InsertCommand UpdateCommand DeleteCommand
2.2 DataSets 생성하기 - 25 - void Form_Load (Object sender, EventArgs e) { SqlConnection connection = new SqlConnection ( data source=.\\sqlexpress;initial catalog=northwind; + integrated security=true"); SqlDataAdapter da = new SqlDataAdapter ("select * from customers,connection); DataSet ds = new DataSet(); da.fill(ds, Customers ); datagridview1.datasource = ds.tables[0]; }
2.3 DataSet 으로부터데이터베이스수정하기 - 26 - Client SelectCommand Server DataSet DataAdapter Data DataTable Fill Update Database Data InsertCommand UpdateCommand DeleteCommand
2.3 DataSet 으로부터데이터베이스수정하기 - 27 - DataAdapter.Update() 호출 InsertCommand,UpdateCommand, DeleteCommand 가필요 Visual Studio Wizard로자동생성 SqlCommandBuilder 사용 SqlCommandBuilder scb = new SqlCommandBuilder(mySqlDataAdapter);
2.3 DataSet 으로부터데이터베이스수정하기 - 28 - 새로운 Row 추가하기 (p399) DataRow mydatarow = mydataset.tables("customers").newrow(); mydatarow["customerid ] = "NewID ; //... mydataset.tables["customers ].Rows.Add(myDataRow); mysqldataadapter.update(mydataset, Customers ); 수정하기 DataRow mydatarow =mytabels[ Customers ].Rows[0]; mydatarow[1] = New CustomerName ; // mysqldataadapter.update(mydataset, "Customers"); 삭제하기 mytabels[ Customers ].Rows[0].Delete(); mysqldataadapter.update(mydataset, "Customers"); mydataset.acceptchanges();
3. DataView 사용하기 - 29 - DataSet의 DataTable에있는데이터를정렬해서보여주거나필터링해서보여줌 DataView mydataview = new DataView( mydataset.tables["customers ]); mydataview.sort = Country ; mydataview.rowfilter = Country= Mexio ;
4. XML 데이터바인딩하기 - 30 - DataSet 으로 XML 데이터읽어오기 DataSet ds = new DataSet(); ds.readxml( c:\\temp\\filename.xml"); datagrid1.datasource = ds.tables[0]; DataSet을 XML 파일로저장하기 DataSet ds = new DataSet(); SqlDataAdapter da = new SqlDataAdapter ("select * from Employees", conn); da.fill(ds); ds.writexml( c:\\temp\\filename.xml");
DataReader 사용하여데이터베이스연결하기 1 ADO.NET 객체모델 1.1.NET Data Provider 란? 2 DataReader 사용하기 2.1 데이터베이스연결하기 2.2 Command 사용하기 2.3 DataReader 로부터데이터읽기 2.4 수정, 삭제, 추가하기 3. 저장프로시저사용하기 - 31 -
1 ADO.NET 객체모델 - 32 - 데이터베이스.NET Data Provider Connection Transaction Command Parameters DataReader DataAdapter SelectCommand InsertCommand UpdateCommand DeleteCommand DataSet DataTable DataRowCollection DataColumnCollection
2. DataReader 사용하기 - 33 - DataReader 개요 연결환경 (Connected Environment) Read-only Forward-Only DataReader 생성하기 데이터베이스수정, 추가, 삭제하기 Command사용
2.1 데이터베이스연결하기 - 34 - SqlConnection 사용 SqlConnection mysqlconnection = new SqlConnection( data source=.\\sqlexpress;initial catalog=northwind; + Integrated security=true"); OleDbConnection 사용 OleDbConnection myoledbconnection = new OleDbConnection( provider=sqloledb; + data source=localhost;initial catalog=northwind; + initial catalog=true ); Data Source 서버이름 Initial catalog 데이터베이스이름 SQL Server 인증 - Windows 인증 Integrated security = TRUE or SSPI - Mixed 인증 User ID=sa;Password=password
2.2 Command 사용하기 - 35 - SQL 문이나저장프로시저를실행 SqlCommand cmd = new SqlCommand( "select * from customers" mysqlconnection ); SqlDataReader dr = cmd.executereader()); Command 객체를수행하기위해서는다음중하나를호출 단일값 ( 예 : 집계값 ) 레코드들 DataReader 생성데이터베이스변경 Insert,Update,Delete문 Command 객체 ExecuteScalar() ExecuteReader() ExecuteNonQuery() 데이터베이스
2.3 DataReader 로부터데이터읽기 - 36 - Read() 를호출하여각레코드를읽기 명확하게 Connection을 Open/Close 해주어야한다 while( myreader.read()) { ListBox1.Items.Add(myReader["CustomerID ] + + myreader[1] + + myreader.getint32(2) ); }
2.4 수정, 삭제, 추가하기 - 37 - Command 객체를사용 SqlCommand cmd = new SqlCommand( delete from customers where CustomerID= AAAAA, mysqlconnection ); int result= cmd.executenonquery()); Command 객체 데이터베이스변경 Insert,Update,Delete문 ExecuteNonQuery() 데이터베이스
3. 저장프로시저사용하기 - 38 - Command 객체사용 CommandType = CommandType.StoredProcedure CommandText = 저장프로시저이름 단일값 ( 예 : 집계값 ) 레코드들 DataReader 생성데이터베이스변경 Insert,Update,Delete문 Command 객체 ExecuteScalar() ExecuteReader() ExecuteNonQuery() 데이터베이스 Parameter 사용 ParameterDirection = Input or Output
3. 저장프로시저사용하기 - 39 - SqlConnection con = new SqlConnection ("data source=.\\sqlexpress; + integrated security=true;initial catalog=northwind"); SqlCommand cmdsp = new SqlCommand( Employee Sales by Country", con); cmdsp.commandtype = CommandType.StoredProcedure; SqlParameter p1 = new SqlParameter("@Beginning_Date",SqlDbType.DateTime); p1.direction = ParameterDirection.Input; p1.value = 96/1/1 ; SqlParameter p2 = new SqlParameter("@Ending_Date", SqlDbType.DateTime); p2.direction = ParameterDirection.Input ; P2.Value = 96/12/31 ; cmdsp.parameters.add(p1); cmdsp.parameters.add(p2); //SqlDataReader dr = cmdsp.executereader(); DataReader 사용 //DataSet 사용 SqlDataAdapter da = new SqlDatAdapter(); da.selectcommand = com; DataSet ds = new DataSet(); da.fill(ds); datagridview1.datasource = ds.tables[0];
여러개테이블작업하기 - 40 - DataSet에테이블여러개넣기 테이블간에관계 (Relation) 설정하기 관련있는데이터가져오기
1. DataSet에테이블여러개넣기 - 41 - 첫번째테이블넣기 dacustomers = new SqlDataAdapter _ ("select * from Customers", conn1) dacustomers.fill(ds, "Customers"); 두번째테이블넣기 daorders = New SqlDataAdapter _ ("select * from Orders", conn2) daorders.fill(ds, "Orders"); Customers conn1 conn2 DataSet Orders
2. 테이블간에관계 (Relation) 설정하기 - 42 - DataColumn parentcol = ds.tables["customers ].Columns["CustomerID ]; Identify parent column DataColumn Identify child childcol column = ds.tables["orders ].Columns["CustomerID ]; parentcol Customers table DataRelation DataRelation Create DataRelation dr = new ("name", parentcol, childcol) ds.datarelations.add(dr); DataSet Orders table childcol
3. 관련있는데이터가져오기 - 43 - ds.tables[index].rows[index].getchildrows("relation"); ds.tables[index].rows[index].getparentrow("relation"); Customers GetChildRows Orders DataSet GetParentRow
3. 관련있는데이터가져오기 - 44 - DataView tableview; DataRowView currentrowview; tableview = new DataView(ds.Tables["Customers"]); currentrowview = tableview[dgcustomers.selectedindex]; dgchild.datasource = currentrowview.createchildview("custorders"); Customers DataRowView Orders DataView CreateChildView DataSet
DB에 Image 데이터저장하기 - 45 - DataSet 사용 Image를 DB에저장하기 DB에서 Image 가져오기 DataReader 사용 Command 사용 - Image를 DB에저장하기 DB에서 Image 가져오기 DB 에서원하는 Image 읽어오기
DataSet 사용 - Image를 DB에저장하기 - 46 - SqlConnection con = new SqlConnection ("data source=.;initial catalog=northwind;integrated security=true"); SqlDataAdapter da = new SqlDataAdapter("Select * From MyImages", con); SqlCommandBuilder MyCB = new SqlCommandBuilder(da); DataSet ds = new DataSet("MyImages"); da.missingschemaaction = MissingSchemaAction.AddWithKey; FileStream fs = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.Read); byte[] MyData = new byte[fs.length]; fs.read(mydata, 0, System.Convert.ToInt32(fs.Length)); fs.close(); da.fill(ds, "MyImages"); DataRow myrow; myrow = ds.tables["myimages"].newrow(); myrow["description"] = "This would be description text"; myrow["imgfield"] = MyData; ds.tables["myimages"].rows.add(myrow); da.update(ds, "MyImages");
DataSet 사용 - DB 에서 Image 읽어오기 - 47 - //DB에저장된이미지를읽어와서파일로저장하고 PictureBox 에보여줌 SqlConnection con = new SqlConnection ("data source=.;initial catalog=northwind;integrated security=true"); SqlDataAdapter da = new SqlDataAdapter("Select * From MyImages", con); SqlCommandBuilder MyCB = new SqlCommandBuilder(da); DataSet ds = new DataSet("MyImages"); byte[] MyData = new byte[0]; da.fill(ds, "MyImages"); DataRow myrow; myrow = ds.tables["myimages"].rows[0]; MyData = (byte[])myrow["imgfield"]; int ArraySize = new int(); ArraySize = MyData.GetUpperBound(0); FileStream fs = new FileStream(@"C:\db.jpg", FileMode.OpenOrCreate, FileAccess.Write); fs.write(mydata, 0, ArraySize); fs.close(); picturebox1.image = Image.FromFile(newFilename);
Command 사용 - Image를 DB에저장하기 1-48 - FileStream fs = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.Read); byte[] bs = new byte[fs.length]; fs.read(bs, 0, System.Convert.ToInt32(fs.Length)); fs.close(); SqlConnection con = new SqlConnection ("data source=.;initial catalog=northwind;integrated security=true"); SqlCommand com = new SqlCommand ("INSERT INTO MyImages(Description, + ImgField) VALUES (@Description, @ImgField)", con); SqlParameter p = new SqlParameter("@Description",System.Data.SqlDbType.VarChar); p.value = "Sample"; com.parameters.add(p);
Command 사용 - Image를 DB에저장하기 2-49 - SqlParameter binparam = new SqlParameter("@ImgField", System.Data.SqlDbType.Image); binparam.direction = ParameterDirection.Input; binparam.offset = 0; binparam.size = bs.length; binparam.value = bs; com.parameters.add(binparam); con.open(); com.executenonquery(); con.close();
DataReader 사용 - DB 에서 Image 읽어오기 - 50 - // DB 에저장된이미지를가져와서 newfilename 으로저장하고 PictureBox에보여주기 SqlConnection con = new SqlConnection ("data source=.;initial catalog=northwind;integrated security=true"); SqlCommand com = new SqlCommand(" SELECT ImgField FROM MyImages", con); con.open(); SqlDataReader OutputReader = com.executereader(); byte[] bs = new byte[0]; if (OutputReader.Read()) { } bs = (byte[])outputreader.getvalue(0); int ArraySize = new int(); ArraySize = bs.getupperbound(0); FileStream fs = new FileStream(newFilename, FileMode.OpenOrCreate, FileAccess.Write); con.close(); fs.write(bs, 0, ArraySize); fs.close(); picturebox1.image = Image.FromFile(@"C:\db.jpg");
DB 에서원하는 Image 읽어오기 - DataReader 사용 // id 에해당하는이미지 (ImgField) 읽어와서 PictureBox 에보여주기 String sql = "select ImgField from MyImages where id= @id"; SqlConnection con = new SqlConnection( "data source=.;initial catalog=northwind;integrated security=true"); SqlCommand cmd = new SqlCommand(sql, con); SqlDataReader reader = null; SqlParameter param = new SqlParameter("@id", SqlDbType.VarChar); param.value = textbox1.text; cmd.parameters.add(param); con.open(); reader = cmd.executereader(); reader.read(); if (reader.getvalue(0)!= null) { } byte[] imgarray = (byte[])reader.getvalue(0); MemoryStream stream = new MemoryStream(imgArray); picturebox1.image = System.Drawing.Image.FromStream(stream); reader.close(); con.close(); - 51 -