03. ADO 닷넷 탄생배경 인터넷환경에가장적합한기술필요 통합적으로관리할수있는기술이필요 더많은양의데이터를더빠르게서비스할수있는인터넷응용프로그램필요성대두 ' 데이터저장소 개념의필요 어느한컴퓨터에의존하는것이아니라여러다른장소에서언제든서비스받도록되어야함 데이터가어디에있던어떻게저장되어있던동일한인터페이스로개발필요 XML 을지원 표준화된자료전달방식의필요
03. ADO 닷넷 ADO 닷넷이란? ADO(ActiveX Data Objects) 의닷넷버전 비연결방식 (Discected Mdel) 제공 데이터베이스와연결후필요한데이터를가져온후에, 접속을바로끊고나서도데이터를계속해서처리할수있는방법이필요 자원을계속많이확보가능 자료의처리는연결이끊어진후에도가능 접속한사용자에게빠른처리가능 서버쪽부담이적어지게됨 XML(eXtesible Markup Laguage) 지원 저장된자료들의표준화 네트워크상에서자료를주고받을때공통적인전달수단
03. ADO 닷넷 ADO 닷넷의클래스구조 데이터공급자 (Data Prvider) 데이터베이스와연결이된상태에서만사용이가능 ' 연결 (Cecti)' 클래스 데이터베이스와의접속을수행 ' 명령 (Cmmad)' 클래스 연결이된후에데이터처리에관계된명령 데이터를읽고, 쓰고, 수정하고, 삭제하는작업수행 데이터리더 (DataReader) 클래스 자료를하나씩읽어서처리
03. ADO 닷넷 데이터셋 (Data Set) ' 비연결방식 ' 을지원하기위해별도로설계된클래스 메모리에저장한내용을체계적으로관리 DataTable 클래스, DataRelati 클래스가내부에서사용 ' 데이터어댑터 (Data Adapter)' 클래스 소속은데이터공급자 데이터베이스와연결이된상태에서만동작 ' 데이터셋 (DataSet)' 클래스에다가데이터를채우는역할을수행일종의다리역할을수행
04. DB 와긴밀히연결되는데이터공급자클래스 DB 연결을위한 Cecti 클래스 연결을수행 SqlCecti,OracleCecti 클래스 MS SQL 서버나 Oracle 서버와직접연결 OleDbCecti 다른데이터베이스와접속할용도로사용
04. DB 와긴밀히연결되는데이터공급자클래스 연결매개변수 = 값 ;[ 연결매개변수 = 값 ;] SQL 서버 2005 익스프레스에접속할경우연결문자열사용예 Private strc As Strig = "Data Surce=.\SQLEXPRESS;AttachDbFileame= DataDirectry \exampledb. mdf;itegratedsecurity=true;user Istace=True" ' 액세스 DB 사용할경우연결문자열사용예 Private strc As Strig = "Prvider=Micrsft.Jet.OLEDB.4.0;DataSurce=c:\db\example.mdb;" 'SQL 서버를사용할경우연결문자열의사용예. Private strc As Strig = "Prvider=SQLOLEDB.1;Data Surce=raisvr;IitialCatalg=MyDB;User ID=admi;"
04. DB 와긴밀히연결되는데이터공급자클래스 ' 오라클서버를사용할경우연결문자열의사용예 Private strc As Strig = "Data Surce=Oracle9i;UserID=*****;Passwrd=*****;" ' 엑셀파일로접속할경우연결문자열사용예. 'Exteded Prperties 는반드시 로감싸야함. 'HDR=Yes 는첫번째행을자료가아니라열의이름으로인식하라고지정. 'IMEX=1 은모든자료를텍스트로가져오라고지정. Private strc As Strig = Prvider=Micrsft.Jet.OLEDB.4.0;DataSurce=D:\MyExcel.xls; Exteded Prperties=""Excel8.0;HDR=Yes;IMEX=1""
04. DB 와긴밀히연결되는데이터공급자클래스 서버탐색기에서직접 SQL 서버에연결 속성창의 CectiStrig 에자동으로연결문자열작성
04. DB 와긴밀히연결되는데이터공급자클래스 연결클래스 Public Sub New(ByVal cectistrig As Strig) * cectistrig : 연결문자열 'OleDB를이용한연결객체생성 Dim m_c As OleDbCecti = New OleDbCecti(strC) 'SQL 서버로접속할연결객체생성 Dim m_c As SqlCecti = New SqlCecti(strC) ' 오라클서버로접속할연결객체생성 Dim m_c As OracleCecti = New OracleCecti(strC)
04. DB 와긴밀히연결되는데이터공급자클래스 연결수행및끊음 Public Sub Ope() Public Sub Clse() * Ope() : 데이터베이스와연결을수행합니다. * Clse() : 데이터베이스와의연결을해제합니다. m_c.ope() 'DB와연결함 m_c.clse() 'DB와연결닫음
04. DB 와긴밀히연결되는데이터공급자클래스 DB 명령실행을위한 Cmmad 클래스와 DataReader 클래스 일단연결이된후에데이터처리에관계된명령 OleDbCmmad, SqlCmmad( 또는OracleCmmad) 데이터를읽고, 쓰고, 수정하고, 삭제하는작업이가능 Public Sub New(ByVal cmdtext As Strig,ByVal cecti) * cmdtext : SQL 질의의문자열을만들어전달합니다. * cecti : 연결객체를전달합니다. 'Cmmad 객체생성 Dim cmd As SqlCmmad = New SqlCmmad( _ "Select * frm [ 신입사원 ]", m_c) CmmadText 속성 생성된명령객체의질의문을중간에바꿀경우사용 cmd.cmmadtext = "Select max( 필기 ) frm [ 신입사원 ]"
04. DB 와긴밀히연결되는데이터공급자클래스 데이터리더클래스로자료를하나씩읽기 - ExecuteReader SQL 질의중에 Select' 문을사용하여준비된레코드를하나씩꺼내서사용하기편하게함 Public Fucti ExecuteReader() As SqlDataReader 'DataReader 객체를실행하여전달받음 Dim dr As SqlDataReader = cmd.executereader
04. DB 와긴밀히연결되는데이터공급자클래스 자료를하나씩읽는방법 Read() 라는메서드를호출 Public Fucti Read() As Blea * 반환값 : True - 성공적으로읽어옴, False - 읽어오는데실패함. 데이터가없슴 While dr.read()... Ed While
04. DB 와긴밀히연결되는데이터공급자클래스 읽혀진값알기 GetValue() 라는메서드의반환값 Public Fucti GetValue(ByVal rdial As Iteger) As SqlDataReader While dr.read() Debug.WriteLie(CStr(dr(0))) ' 첫번째필드값출력 Debug.WriteLie(CStr(dr(1))) ' 두번째필드값출력 Ed While
05. 추가, 수정, 삭제를위한 ExecuteNQuery 자료를추가하고수정하고삭제하는작업 명령클래스의 ExecuteNQuery() 메서드를호출 ' 요구 (Query) 하는게없는 (N) 명령을수행 (Execute) 한다 ' 는뜻의메서드 Isert','Update','Delete' 같은레코드의반환이필요없는질의를수행할때호출 Public Fucti ExecuteNQuery() As Iteger * 반환값 : 영향받은레코드의개수 Dim strcmd As Strig = "Delete Frm [ 신입사원 ] Where 번호 = '1 " 'Cmmad 객체생성 Dim cmd = New SqlCmmad(strCmd, m_c) cmd.executenquery() Delete SQL 질의실행
06. 반환값을얻기위한 ExecuteScalar SQL 질의문중에 Cut(), Avg() 같은집합체 (Aggregate) 함수를사용가능 계산된결과를반환 명령클래스에는 ExecuteScalar() 라는메서드 Public Fucti ExecuteScalar() As Object cmd.cmmadtext = "Select max( 필기 ) frm [ 신입사원 ] Debug.Writelie(cmd.ExecuteScalar())
07. 데이터셋클래스의연결을위한데이터어댑터 (DataAdapter) 클래스 데이터어댑터클래스 데이터베이스와연결된동안에만동작을수행 데이터들을가져와서데이터셋클래스의구조에맞게데이터를변환해서넣어주는작업 필요한데이터를일단가져오자마자접속을끊고, 메모리상에서데이터를처리할수있는방법을지원 DB 와연결을유지하지않는데이터셋클래스 데이터들의집합을관리하는클래스
07. 데이터셋클래스의연결을위한데이터어댑터 (DataAdapter) 클래스 자료의읽기 1 데이터베이스와연결 연결객체의 Ope() 메서드 m_c.ope() 'DB 와연결함 2 데이터어댑터객체생성 실제로사용할데이터어댑터객체를생성 Public Sub New() 'DataSet 을사용하기위해 DataAdapter 객체생성 Dim adpt As SqlDataAdapter = New SqlDataAdapter() 3 SelectCmmad 속성에자료읽는 SQL 질의지정 어떤자료를가져와서데이터셋에다가저장하도록할건지결정 SelectCmmad 속성에다가명령객체를생성해서대입 Public Prperty SelectCmmad As SqlCmmad adpt.selectcmmad = New SqlCmmad( "Select * frm [ 신입사원 ]", m_c)
07. 데이터셋클래스의연결을위한데이터어댑터 (DataAdapter) 클래스 4 데이터셋객체를생성함 실제로메모리상에서처리할데이터셋객체생성 DataSet 클래스로객체를생성 DataSet 클래스 Public Sub New() Dim ds As DataSet = New DataSet() 'DataSet 객체를생성 5 데이터셋에자료를저장함 데이터어댑터를동작시켜서데이터베이스로부터자료를가져와데이터셋에저장 데이터어댑터객체의 Fill() 메서드를사용 Public Fucti Fill(ByVal dataset As DataSet) As Iteger adpt.fill(ds) ' 생성한 DataSet 객체에데이터를읽어서저장함 6 데이터베이스와의연결을해제 데이터베이스의자원을돌려주기위해서접속을끊음 m_c.clse() 'DB 와연결닫음
08. 데이터셋을 DB 에실제로저장하기 데이터셋은메모리상에서상태값을가짐 처음에는모든레코드가 UChaged' 라는값을가지고있음어느한레코드의내용이수정되면그레코드만 Mdified' 라는값을가짐레코드를추가하면 Added' 라는값을가짐삭제를수행하면 Deleted' 라는값을가짐데이터베이스의내용이바뀌는것은아님 데이터어댑터클래스의 Update() 메서드를호출 데이터베이스에실제로반영 표시를해두었던값들을다시원상복귀 AcceptChages() DataSet 클래스 Public Sub AcceptChages() m_ds.acceptchages() ' 변경된상태정보를모두초기화시킴
08. 데이터셋을 DB 에실제로저장하기 DataRw 클래스의 RwState 속성값 현재레코드가가지고있는상태정보알려줌 RwState 속성은 Added,Deleted,Mdified,Uchaged 의상태값반환 DataRw 클래스 Public ReadOly Prperty RwState As DataRwState * DataRwState 열거형값 : Added,Deleted,Mdified,Uchaged Dim r As DataRw ' 임시로읽어온 DataRw를저장할변수 Fr Each r I m_ds.tables(" 신입사원 ").Rws Debug.WriteLie(r.RwState.TStrig) Next
08. 데이터셋을 DB 에실제로저장하기 데이터셋의테이블에서레코드를추가, 수정, 삭제 1 레코드의추가 Tables속성을이용현재사용하려고하는 DataTable 객체를꺼냄 NewRw() 라는메서드를호출 DataTable 클래스 Public Fucti NewRw() As DataRw ' 입력한항목을데이터셋에추가 Dim dr As DataRw = m_ds.tables(" 신입사원 ").NewRw() dr(" 번호 ") = 3 dr(" 필기 ") = 97 dr(" 면접 ") = 90 Rw속성의 Add() 메서드를이용해서 DataRw객체를추가 m_ds.tables(" 신입사원 ").Rws.Add(dr)
08. 데이터셋을 DB 에실제로저장하기 2 레코드의수정 Rws 컬렉션속성에서원하는 DataRw객체만수정원하는필드를고치고싶으면 Item속성수정 m_ds.tables(" 신입사원 ).Rws(0).Item(" 번호 ") = 10" 3 레코드의제거 Rws 컬렉션속성에들어있는 Delete() 메서드를호출 m_ds.tables(" 신입사원 ").Rws(0).Delete()
09. 데이터셋자료의읽기, 추가, 수정, 삭제 CmmadBuilder 클래스 Isert/Delete/UpdateCmmad 속성을자동으로처리 Public Sub New(ByVal adapter As SqlDataAdpater) ' 데이터어댑터객체에게 Isert,Delete,Update 명령을대신만들어준다. Dim cb As New SqlCmmadBuilder(m_adpt)
09. 데이터셋자료의읽기, 추가, 수정, 삭제 데이터어댑터객체의 Update() 메서드 수정사항이데이터베이스에반영 SqlDataAdapter 클래스 Public Fucti Update(ByVal dataset As DataSet,ByVal srctable As Strig) As Iteger m_adpt.update(m_ds, " 신입사원 ") m_ds.acceptchages() ' 변경된상태정보를다시초기화시키고삭제자료제거