첫째, ADO 개요
ADO 는 최신 및 가장 강력한 데이터 액세스 샘플 OLE DB 를 위해 설계된 Microsoft 로 사용하기 쉬운 애플리케이션 계층 인터페이스입니다. ADO 를 사용하면 OLE. DB 공급자를 통해 데이터베이스 서버의 데이터에 액세스하고 조작하는 응용 프로그램을 작성할 수 있습니다. ADO 의 가장 큰 장점은 사용 편의성, 속도, 메모리 지출 감소, 디스크 유적이 적다는 것입니다. ADO 는 핵심 애플리케이션 시나리오에서 최소한의 네트워크 트래픽을 사용하고 프런트엔드와 데이터 소스 간에 최소 계층 수를 사용합니다. 이 모든 것이 경량의 고성능 인터페이스를 제공하기 위한 것입니다. ADO 라고 불리는 것은 비교적 익숙한 은유인 OLE 자동화 인터페이스를 사용한 것이다.
OLE DB 는 ODBC 의 기능을 캡슐화하고 서로 다른 정보 소스에 저장된 데이터에 일관되게 액세스하는 새로운 데이터베이스 하위 계층 인터페이스인 COM (Component Object Model) 인터페이스 세트입니다. OLE DB 는 Microsoft uda (universal data access) 전략의 기술적 기반입니다. OLE DB 는 관계형 및 비관계형 데이터베이스, e-메일 및 파일 시스템, 텍스트 및 그래픽, 맞춤형 비즈니스 객체 등 모든 데이터 소스에 대한 고성능 액세스를 제공합니다. 즉, OLE DB 는 ISAM, Jet 및 관계형 데이터 소스에만 국한되지 않으며 형식 및 저장 방법에 관계없이 모든 유형의 데이터를 처리할 수 있습니다. 실제 애플리케이션에서 이러한 다양성은 Excel 스프레드시트, 텍스트 파일, e-메일/디렉토리 서비스, 심지어 Microsoft Exchange 에 상주하는 데이터와 같은 메일 서버까지 액세스할 수 있음을 의미합니다. 그러나 OLE DB 응용 프로그램 프로그래밍 인터페이스의 목적은 다양한 응용 프로그램에 최상의 기능을 제공하는 것으로, 단순한 요구 사항을 충족하지 못합니다. 필요한 API 는 ActiveX Data Objects (ADO) 와 OLE DB 를 연결하는 다리여야 합니다.
둘째, VC 에서 ADO 사용 (개발 단계는 다음과 같습니다.)
1, ADO 라이브러리 파일 가져오기
ADO 를 사용하기 전에 프로젝트의 stdafx.h 헤더 파일에 직접 가져오기 기호 #import 를 사용하여 ADO 라이브러리 파일을 가져와야 컴파일러가 제대로 컴파일됩니다. 코드는 다음과 같습니다.
#import 를 사용하여 ADO 라이브러리 파일 가져오기
# import "c: \ program files \ common files \ system \ ado \ msado15.dll" no _ namespaces rename "
이 문은 엔지니어링에서 ADO 를 사용하지만 ADO 의 네임스페이스는 사용하지 않으며 상수 충돌을 피하기 위해 상수 EOF 를 adoEOF 로 변경합니다. 이제 다른 헤더 파일을 추가하지 않고도 ADO 인터페이스를 사용할 수 있습니다.
2, OLE/COM 라이브러리 환경 초기화
ADO 라이브러리는 COM 동적 라이브러리 세트입니다. 즉, ADO 를 호출하기 전에 응용 프로그램이 OLE/COM 라이브러리 환경을 초기화해야 합니다. MFC 응용 프로그램에서 더 좋은 방법은 응용 프로그램 마스터 클래스의 InitInstance 멤버 함수에서 OLE/COM 라이브러리 환경을 초기화하는 것입니다.
Bool cmyadotestapp:: initinstance ()
{
If (! AfxOleInit())///이것은 COM 라이브러리 초기화
입니다{
AfxMessageBox(“OLE 초기화 오류! "" );
Return FALSE;;
}
……
}
3, ADO 인터페이스 소개
ADO 라이브러리에는 _ConnectionPtr 인터페이스, _CommandPtr 인터페이스 및 _RecordsetPtr 인터페이스의 세 가지 기본 인터페이스가 포함되어 있습니다.
_ConnectionPtr 인터페이스는 레코드세트나 빈 포인터를 반환합니다. 일반적으로 데이터 연결을 만들거나 결과를 반환하지 않는 SQL 문 (예: 저장 프로시저) 을 실행하는 데 사용됩니다. _ConnectionPtr 인터페이스를 사용하여 레코드세트를 반환하는 것은 좋은 사용 방법이 아닙니다. 레코드를 반환하는 작업은 일반적으로 _RecordserPtr 을 사용하여 수행됩니다. _ConnectionPtr 로 작업할 때 레코드 막대 수를 얻으려면 모든 레코드를 통과해야 하지만 _RecordserPtr 를 사용할 때는 필요하지 않습니다.
_CommandPtr 인터페이스는 레코드세트를 반환합니다. 레코드세트를 반환하는 저장된 프로시저와 SQL 문을 쉽게 실행할 수 있습니다. _CommandPtr 인터페이스를 사용할 때 글로벌 _ConnectionPtr 인터페이스를 이용하거나 _CommandPtr 인터페이스에서 직접 연결 문자열을 사용할 수 있습니다. 한 번 또는 몇 번의 데이터 액세스 작업만 수행할 경우 후자가 더 좋은 선택입니다. 그러나 데이터베이스에 자주 액세스하고 많은 레코드세트를 반환하려면 글로벌 _ConnectionPtr 인터페이스를 사용하여 데이터 연결을 만든 다음 _CommandPtr 인터페이스를 사용하여 저장된 프로시저와 SQL 문을 실행해야 합니다.
_RecordsetPtr 은 레코드세트 객체입니다. 위의 두 객체보다 레코드 잠금, 커서 제어 등과 같은 레코드세트에 더 많은 제어 기능을 제공합니다. _CommandPtr 인터페이스와 마찬가지로 이미 생성된 데이터 연결을 사용할 필요는 없습니다. 연결 포인터를 _RecordsetPtr 의 연결 멤버 변수에 지정하는 연결 문자열 대신 연결 문자열을 사용하여 데이터 연결을 직접 만들 수 있습니다. 여러 레코드세트를 사용하는 경우 Command 객체처럼 데이터 연결이 만들어진 전역 _ConnectionPtr 인터페이스
를 사용하는 것이 가장 좋습니다를 누르고 _RecordsetPtr 을 사용하여 저장된 프로시저와 SQL 문을 실행합니다.
4, _ConnectionPtr 인터페이스 사용
_ConnectionPtr 은 주로 데이터베이스에 대한 연결을 얻기 위한 연결 인터페이스입니다. 연결 문자열은 직접 작성하거나 ODBC DSN 을 가리킬 수 있습니다.
_ connection ptr pconn;
If (failed (pconn.createinstance ("adodb.connection"))
{
Afxmessagebox ("create instance failed!" " );
Return;;
}
CString strSRC;;
Strsrc = "driver = SQL server; Server = ";
Strsrc+= "suppersoft";
Strsrc+= "; Database = ";
Strsrc+= "mydb";
Strsrc+= "; UID=SA;; Pwd = ";
Cstringstrsql = "insert into student (no, name, sex, address) values(3,' AAA',' male','
_ _variant_t varSRC(strSRC););
_ variant _ t varsql (strsql);
_ bstr _ t bstrsrc (strsrc);
If (FAILED(pConn-gt;-gt; 오픈 (bstrsrc, "","",",-1))
{
Afxmessagebox ("can not open database!" " );
Pconn.release ();
Return;;
}
Colevariant vtoptional ((long) disp _ e _ param not found, vt _ error);
PConn-gt;; Execute(_bstr_t(strSQL), amp;; VtOptional,-1);
Pconn.release ();
AfxMessageBox("ok! "" );
5, _RecordsetPtr 인터페이스 사용 (SQL Server 연결 예)
_ recordset ptr pptr;
If (failed (pptr.createinstance ("adodb.recordset"))
{
Afxmessagebox ("create instance failed!" " );
Return FALSE;;
}
CString strSRC;;
Strsrc = "driver = SQL server; Server = ";
Strsrc+= "210.46.141.145";
Strsrc+= "; Database = ";
StrS
Rc+= "mydb";
Strsrc+= "; UID=sa;; Pwd = ";
Strsrc+= "sa";
CString strSQL = "select id, name, gender, address from personal ";
_ _variant_t varSRC(strSRC););
_ variant _ t varsql (strsql);
If (failed (pptr-gt; Open(varSQL, varSRC, adOpenStatic, adLockOptimistic, adCmdText)))
{
AfxMessageBox("Open table failed! "" );
Pptr.release ();
Return FALSE;;
}
While (! PPtr-gt;; GetadoEOF())
{
_ variant _ tvarno;
_ variant _ t varname;
_ variant _ t varsex;
_ variant _ t varaddress;
VarNo = pPtr-gt;; Getcollect ("id");
VarName = pPtr-gt;; Getcollect ("name");
VarSex = pPtr-gt;; Getcollect ("gender");
VarAddress = pPtr-gt;; Getcollect ("address");
Cstringstrno = (char *) _ bstr _ t (varno);
Cstringstrname = (char *) _ bstr _ t (varname);
Cstringstrsex = (char *) _ bstr _ t (varsex);
Cstringstraddress = (char *) _ bstr _ t (varaddress);
Strno.trimright ();
Strname.trimright ();
Strsex.trimright ();
Straddress.trimright ();
Intncount = m _ list.getitemcount ();
Intnitem = m _ list.insertitem (ncount, _ t (""));
M_list.SetItemText (nItem, 0, strno);
M_list.SetItemText (nItem, 1, strname);
M_list.SetItemText (nItem
, 2, strsex);
M_list.SetItemText (nItem, 3, straddress);
PPtr-gt;; Movenext ();
}
PPtr-gt;; 닫기 ();
Pptr.release ();
6, _CommandPtr 인터페이스 사용
_CommandPtr 인터페이스는 Recordset 객체를 반환하고 더 많은 레코드세트 제어 기능을 제공합니다. 다음 코드 예제에서는 _CommandPtr 인터페이스를 사용하는 방법을 보여 줍니다.
코드: _CommandPtr 인터페이스를 사용하여 데이터 가져오기
_ command ptr p command;
_ recordset ptr PRS;
Pcommand.createinstance (_ _ uuidof (command));
P command-gt; ActiveConnection=pConn;;
P command-gt; Commandtext = "select * from student";
P command-gt; CommandType=adCmdText;;
P command-gt; Parameters-gt;; Refresh ();
Prs = p command-gt; Execute(NULL, NULL, adcmdunknown);
_ _variant_t varValue = pRs-gt;; GetCollect("name"); ");
Cstringstrvalue = (char *) _ bstr _ t (varvalue);
7, 데이터 유형 변환 정보 COM 객체는 플랫폼 간 것이기 때문에 다양한 유형의 데이터를 처리하는 일반적인 방법을 사용하므로 Cstring 클래스와 COM 객체는 호환되지 않습니다. COM 객체와 C++ 유형의 데이터를 변환하려면 API 세트가 필요합니다. _vatiant_t 와 _bstr_t 는 두 가지 오브젝트입니다. COM 객체와 C++ 유형의 데이터를 변환하는 일반적인 방법을 제공합니다.