ADO 개체를 사용하여 DELPHI 프로그램의 ODBC 데이터에 액세스
------------------------------------- ----------------------------------
ASP 매니아로서 저는 ASP 페이지에서 ADO 개체를 사용하여 ODBC 데이터베이스를 운영하는 경우가 많습니다. ASP를 사용하여 웹 응용 프로그램 시스템을 만드는 것이 정말 편리하다고 생각합니다. 내 프로그래밍 경력에서 저자는 Borland 시리즈 제품을 선호하고 Microsoft 제품에 대해 약간 혐오감을 갖고 있지만 ASP에 대해서는 예외입니다. 어느 날 갑자기 ADO 개체가 표준 OLE 개체라는 생각이 들었습니다. ADO를 사용하여 델파이 애플리케이션에서 데이터베이스를 작동할 수 있다면 정말 좋을 것 같습니다. 특히 DELPHI를 네트워크 데이터베이스 응용 프로그램으로 사용할 때 웹 사이트가 WINNT 사이트이고 ASP 페이지를 지원하는 경우 ADO 개체를 사용하면 이러한 대규모 BDE를 사이트에 업로드하지 않고도 ODBC 데이터베이스에 액세스할 수 있습니다. 이러한 방식으로 DELPHI 및 ASP의 프로그래밍 장점을 최대한 활용하여 더 나은 ISAPI/NSAPI/CGI를 만들 수 있습니다. 프로그래밍 및 테스트 후에는 ADO 개체를 사용하여 Delphi에서 ODBC 데이터베이스에 액세스할 수 있습니다. 이제 내 경험을 기록하고 모든 사람과 공유하여 ODBC 데이터베이스에 액세스하는 또 다른 방법을 알아볼 것입니다.
32비트 Delphi에서는 변형 변수(예: AVariant)를 선언한 다음 AVariant:=CreateOleObject('ADODB.Connection')와 같은 CreateOleObject를 통해 OLE 개체를 생성하여 데이터베이스 연결 개체의 인스턴스를 가져올 수 있습니다. 이 개체의 메서드와 속성은 ODBC 데이터베이스를 작동하는 데 사용됩니다.
다음은 ODBC 데이터베이스에 액세스하는 데 사용되는 ADO 개체와 해당 메서드 및 속성에 대한 간략한 소개입니다.
1. 데이터베이스 연결 객체(ADODB.Connection)
이 개체는 ODBC 데이터베이스와 연결을 설정하는 데 사용되며 데이터베이스에 대한 모든 작업은 이 연결을 통해 수행됩니다.
데이터베이스 연결 개체 ADODB Connection은 Delphi의 TDatabase 개체처럼 작동합니다.
연결 개체를 설정하는 방법은 다음과 같습니다(AConnection은 Variant 유형 변수입니다).
AConnection:=CreateOleObject('DODB.Connection')
연결을 설정하는 데 사용되는 방법은 Open이고 사용 구문은 다음과 같습니다(예: AConnection 개체 사용).
AConnection.Open( ConnectionString, UserId, PassWord )
세 가지 매개 변수는 모두 문자열 형식입니다. 여기서 UserId와 Password는 사용자 이름과 사용자 비밀번호입니다. 사용자 이름과 사용자 비밀번호는 ConnectionString에서도 지정할 수 있으므로 데이터베이스에 액세스하는 데 사용할 때는 생략할 수 있습니다. ConnectionString은 ODBC 데이터 원본 정보를 설명하는 데 사용되는 문자열입니다.
'PROvider=공급자 이름; DRIVER=서버=데이터베이스=사용자;
안에:
공급자: 데이터 공급자, 기본적으로 MSDASQL, Microsoft OLEDB, 일반적으로 생략됩니다.
DSN: 열려는 데이터베이스에 해당하는 OBDC 시스템 데이터 소스(DSN)는 선택적 매개변수입니다.
DRIVER : 오픈하고자 하는 데이터베이스에 사용되는 드라이버 이름(선택적 매개변수인 Microsoft Access Driver(*.mdb))에 해당하는 접근권한.
SERVER: 열려는 데이터베이스가 있는 서버의 이름으로, 이 머신(로컬)에서 사용 가능하며 선택적 매개변수입니다.
DATABASE: 오픈할 데이터베이스 이름. 선택적 파라미터.
UID: 데이터베이스에 액세스하는 데 사용되는 사용자 이름은 선택적 매개변수입니다.
PWD: 데이터베이스에 액세스하는 데 사용되는 사용자 비밀번호는 선택적 매개변수입니다.
위의 매개변수는 선택사항이지만 시스템 데이터 소스를 설명하려면 충분한 정보를 제공해야 합니다.
ODBC 시스템 DSN이 정의되고 이름이 MyDsn인 경우 다음 명령문을 사용하여 데이터베이스 연결을 설정할 수 있습니다.
AConnection.Open('DSN=MyDsn');
DSN이 존재하지 않거나 다른 사람이 해당 설정을 수정한 경우 응용 프로그램 실행 오류를 방지하기 위해 ADODB.Connection을 사용하여 임시 ODBC 데이터 소스를 생성하면 우리가 사용하는 시스템 DSN의 매개 변수 설정이 올바른지 확인할 수 있습니다. . 다음 명령문은 ACCESS 데이터베이스에 해당하는 임시 ODBC 시스템 DSN을 생성할 수 있습니다. 경로는 C:Inetpub wwwroot test.mdb입니다.
AConnection.open('드라이버= {Microsoft Access Driver (*.mdb)};DBQ=C:inetpub wwwroot est.mdb')
ADODB.Connection을 설정한 후 작업 결과(삭제, 수정, 업데이트 등)를 반환할 필요가 없으면 이 때 ADODB.Connection의 다른 메서드를 사용하여 데이터베이스에 대한 일반적인 SQL 작업을 수행할 수 있습니다. , 실행이 사용됩니다. 구문은 다음과 같습니다.
AConnection.Execute( strSQL );
그 중 strSQL은 작업을 수행하는 SQL 문입니다. 예를 들어 삭제 작업은 wfjcommu에서 삭제될 수 있습니다. AConnection.Close를 사용하여 데이터베이스 연결을 닫습니다.
2. 데이터 세트 객체(ADODB. RecordSet)
쿼리 연산을 수행하고 쿼리 결과를 반환하고 싶거나, 데이터 테이블을 보다 편리하게 조작하고 싶다면 데이터셋 객체를 사용해야 합니다.
데이터 세트 개체 ADODB.RecordSet은 Delphi의 TTable 또는 TQuery 개체처럼 작동합니다.
데이터 세트 객체를 생성하는 방법은 다음과 같습니다(ARecordSet은 Variant 유형 변수입니다).
ARecordSet:=CreateOleObject('ADODB.RecordSet')
데이터 테이블에서 데이터를 얻는 방법은 Open 방법입니다. 구체적인 사용 방법은 다음과 같습니다.
ARecordSet.Open(strCommand,ActiveConnection,int CursorType,intLockType, intCommandType);
안에:
strCommand: 명령 매개변수인 문자열은 테이블 이름, SQL 문 또는 서버의 저장 프로시저(StoredProc) 이름일 수 있습니다. 특정 매개변수는 다음 매개변수 intCommandType으로 지정되어야 합니다.
ActiveConnection: 사용할 데이터베이스 연결은 ADODB 연결 개체입니다.
intCursorType: 긴 정수, 데이터 세트의 커서 유형, 선택적 매개변수, 프로그램의 설명을 참조하세요.
intLockType: 긴 정수, 데이터 테이블의 잠금 유형, 선택적 매개변수, 프로그램의 설명을 참조하십시오.
intCommandType: strCommand의 역할을 나타내는 데 사용되는 긴 정수, 명령(예: SQL 문), 데이터 테이블(TTable) 또는 저장 프로시저(StoredProc)로 지정할 수 있습니다. 매개변수는 프로그램의 설명을 참조하세요.
SQL 쿼리를 실행하려면 다음 문을 사용할 수 있습니다.
ARecordSet.Open('wfjcommu에서 * 선택',adOpenStatic,ad LockOptimistic,adCmdText);
TTable 및 TQuery와 비교되는 기타 일반적인 속성 및 메서드는 다음과 같습니다(자세한 내용은 ASP 도움말 파일 참조).
eof,bof: eof,bof. MoveFirst, MoveLast: 첫 번째, LastMovePrevious, MoveNext: 이전, NextMove: MoveByAddNew: AppendUpdate: PostClose: 닫기
삭제 + 업데이트: 삭제, 데이터 테이블에 대한 모든 수정은 작업을 효과적으로 수행하기 위해 업데이트를 사용해야 합니다. 이는 Delphi와 다릅니다.
필드[필드번호]: 필드[필드번호]
필드['필드 이름']: FieldByName('필드 이름')
3. 기타 공통 개체(Delphi에 해당하는 개체):
ADODB.Field: TField ADODB.매개변수: TPara ADODB.Error: EDBEngineError
ADODB.Command: 없음 ADODB.Property: 없음
적용 예를 살펴보겠습니다.
절차 TForm1.Button1Click(Sender: TObject);
**************************************************** ***** ****
ADO를 사용하여 ODBC 데이터베이스 운영
이 프로그램에서는 MsAccess 데이터베이스를 가리키는 임시 ODBC 시스템 데이터 원본이 생성되고 그 안의 데이터 테이블이 표시, 추가, 수정, 삭제 및 쿼리됩니다.
참고: Uses 문에 ComObj 단위를 포함하십시오.
************************************************** * ***}
const{일부 상수 선언, 자세한 내용은 adovbs.inc를 참조하세요.}
{------CommandType에 대한 상수 설명----}
adCmdUnknown = 0008;//알 수 없음, 시스템에서 판단해야 함, 느림, 기본값
adCmdText = 0001;//SQL 문과 같은 명령문
adCmdTable = 0002; //데이터 테이블 이름
adCmdStoredProc = 0004;//저장 프로시저 이름
{------CursorType에 대한 상수 설명----}
adOpenForwardOnly = 0;//기본값인 앞에서 뒤로 한 방향으로만 액세스할 수 있습니다.
adOpenKeyset = 1;//다른 사용자가 데이터를 수정한 내용은 표시되지만 다른 사용자가 추가 및 삭제한 내용은 표시되지 않습니다.
adOpenDynamic = 2; //다른 사용자의 데이터 추가, 수정 및 삭제가 표시됩니다.
adOpenStatic = 3; //다른 사용자의 데이터 추가, 수정 및 삭제는 표시되지 않습니다.
{------LockType에 대한 상수 설명---}
adLockReadOnly = 1; //읽기 전용, 기본값
adLockPessimistic = 2; //수정시 단일 레코드로 잠금
adLockOptimistic = 3; //수정 후 업데이트 시 단일 레코드로 잠금
adLockBatchOptimistic = 4; //일괄 업데이트 중 잠금을 기록합니다.
var
AConnection, ARecordSet : 변형;
longintTemp : 정수;
strTemp: 문자열;
intIndex : 정수;
시작하다
{임시 ODBC 데이터 소스를 생성하고, MsAccess 데이터베이스를 가리키며, 이 DSN을 사용하여 데이터베이스 연결을 설정합니다.}
AConnection := CreateOleObject('ADODB.Connection');
AConnection.Open('Driver={Microsoft Access Driver(*.mdb)};DBQ=C:inetpubwwwroot est');
{데이터세트 개체 생성 및 데이터 테이블에서 데이터 추출}
ARecordSet := CreateOleObject('ADODB.RecordSet');
ARecordSet.open( 'wfjcommu',AConnection,adOpenStatic,adLockOptimistic,adCmdTable );
memo1.lines.clear;
memo1.lines.add('********데이터 테이블의 원본 내용은 다음과 같습니다********');
{각 도메인의 도메인 이름 표시}
strTemp := '';
intIndex := 0에서 ARecordSet.Fields.count까지 - 1 do
strTemp := strTemp + ARecordSet.Fields[intIndex].name+';';
memo1.lines.add( strTemp );
{각 도메인의 콘텐츠 표시}
ARecordSet.eof가 아닌 동안
시작하다
strTemp := '';
intIndex := 0에서 ARecordSet.Fields.count까지 - 1 do
strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';
memo1.lines.add( strTemp );
ARecordSet.MoveNext;//다음 막대로 이동, 다음
끝;
{기록 추가}
ARecordSet.AddNew;//추가,추가
ARecordSet.Fields['AName'] := '1';//FieldByName에 의한 액세스
ARecordSet.Fields['Portable'] := '2';
ARecordSet.Fields(2) := '3';//Fields[index] 형식으로 액세스
ARecordSet.Fields(3) := '4';
ARecordSet.Fields(4) := '5';
ARecordSet.Update;//업데이트, 게시
ARecordSet.MoveFirst;//첫 번째 항목으로 이동, First
memo1.lines.add('********레코드 추가 후 데이터 테이블의 내용은 다음과 같습니다********');
{각 도메인의 콘텐츠 표시}
ARecordSet.eof가 아닌 동안
시작하다
strTemp := '';
intIndex := 0에서 ARecordSet.Fields.count까지 - 1 do
strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';
memo1.lines.add( strTemp );
ARecordSet.MoveNext;//다음 막대로 이동, 다음
끝;
{마지막 기록 수정}
ARecordSet.MoveLast;
ARecordSet.Fields['AName'] := '11';//FieldByName을 사용하여 액세스
ARecordSet.Fields['Portable'] := '22';
ARecordSet.Fields(2) := '33';//Fields[index] 형식으로 액세스
ARecordSet.Fields(3) := '44';
ARecordSet.Fields(4) := '55';
ARecordSet.Update;//업데이트, 게시
ARecordSet.MoveFirst;//첫 번째 항목으로 이동, First
memo1.lines.add('********마지막 레코드 수정 후 데이터 테이블의 내용은 다음과 같습니다********');
{각 도메인의 콘텐츠 표시}
ARecordSet.eof가 아닌 동안
시작하다
strTemp := '';
intIndex := 0에서 ARecordSet.Fields.count까지 - 1 do
strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';
memo1.lines.add( strTemp );
ARecordSet.MoveNext;//다음 막대로 이동, 다음
끝;
{마지막 기록 삭제}
ARecordSet.MoveLast;//마지막 막대로 이동, Last
ARecordSet.delete;//삭제, 삭제
ARecordSet.Update;//업데이트, Delphi에서는 필요하지 않음
ARecordSet.MoveFirst;//첫 번째 항목으로 이동, First
memo1.lines.add('********마지막 레코드 삭제 후 데이터 테이블의 내용은 다음과 같습니다********');
{각 도메인의 콘텐츠 표시}
ARecordSet.eof가 아닌 동안
시작하다
strTemp := '';
intIndex := 0에서 ARecordSet.Fields.count까지 - 1 do
strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';
memo1.lines.add( strTemp );
ARecordSet.MoveNext;//다음 막대로 이동, 다음
끝;
ARecordSet.Close;{데이터 세트 닫기}
{SQL 문을 사용하여 "Zhang San"이라는 레코드를 쿼리합니다.}
{SQL 문에서 문자열은 작은따옴표로 묶어야 합니다.}
ARecordSet.open( 'wfjcommu에서 *를 선택하세요. 여기서 AName = ''Zhang San''',
AConnection,adOpenStatic,adLockOptimistic,adCmdText);
memo1.lines.add('********장삼의 내용은 다음과 같습니다********');
memo1.lines.add( 'Total' + IntToStr( ARecordSet.RecordCount ) + '일치하는 레코드' );
{각 도메인의 콘텐츠 표시}
ARecordSet.eof가 아닌 동안
시작하다
strTemp := '';
intIndex := 0에서 ARecordSet.Fields.count까지 - 1 do
strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';
memo1.lines.add( strTemp );
ARecordSet.MoveNext;//다음 막대로 이동, 다음
끝;
{데이터 세트 및 데이터베이스 연결 닫기}
ARecordSet.close;
AConnection.close;
끝;
다른 사람들의 말을 들어보니 실제 사례를 보면서 직접 경험해 보는 것이 더 낫다고 합니다. 이 예에서는 ADO 개체를 사용하여 데이터 테이블에서 레코드를 쿼리, 추가, 수정 및 삭제하는 방법을 보여줍니다. 구체적인 사용법은 프로그램 내 설명을 참조하시기 바랍니다. 델파이 데이터베이스 프로그래밍 경험이 있다면 이해하기 어렵지 않을 것입니다.
예제에 사용된 데이터베이스는 이름, 휴대폰 번호, 전화 번호, 호출기 번호 및 우편 주소를 나타내는 AName, Portable, Tel, BP 및 PostAddress 5개 필드가 있는 wfjcommu라는 데이터 테이블이 있는 Test.MDB입니다. 각기.
위 프로그램은 PWIN98+ Delphi 3.0+PWS(Personal Web Server) 4.0에서 디버깅 및 전달되었습니다.