ADO オブジェクトを使用して DELPHI プログラムの ODBC データにアクセスする
-------------------------------------------------- ----------------------------------
ASP 愛好家として、私は ASP ページで ADO オブジェクトを使用して ODBC データベースを操作することがよくありますが、ASP を使用して Web アプリケーション システムを作成するのは確かに非常に便利だと感じています。筆者はプログラミングのキャリアの中でBorlandシリーズの製品を好み、Microsoft製品には少々抵抗があるのですが、ASPに関しては例外です。ある日、ADO オブジェクトが標準の OLE オブジェクトであることに気づきました。ADO を使用して Delphi アプリケーションでデータベースを操作できたらいいのにと思いました。特に DELPHI をネットワーク データベース アプリケーションとして使用する場合、Web サイトが WINNT サイトで ASP ページをサポートしていれば、そのような大規模な BDE をサイトにアップロードしなくても、ADO オブジェクトを使用して ODBC データベースにアクセスできます。このようにして、DELPHI と ASP のプログラミングの利点を最大限に活用して、より優れた ISAPI/NSAPI/CGI を作成できます。プログラミングとテストが完了すると、ADO オブジェクトを使用して Delphi の ODBC データベースにアクセスできるようになりました。ここで、ODBC データベースにアクセスする別の方法を確立できるように、私の経験を書き留めて皆さんと共有します。
32 ビット Delphi では、バリアント変数 (AVariant など) を宣言し、CreateOleObject を通じて OLE オブジェクト (AVariant:=CreateOleObject ('ADODB.Connection') など) を作成して、データベース接続オブジェクトのインスタンスを取得できます。このオブジェクトのメソッドとプロパティは、ODBC データベースの操作に使用されます。
以下に、ODBC データベースへのアクセスに使用される ADO オブジェクトとそのメソッドとプロパティについて簡単に紹介します。
1. データベース接続オブジェクト (ADODB.Connection)
このオブジェクトは ODBC データベースとの接続を確立するために使用され、データベースに対するすべての操作はこの接続を通じて実行されます。
データベース接続オブジェクト ADODB.Connection は、Delphi の TDatabase オブジェクトのように機能します。
接続オブジェクトを確立するメソッドは次のとおりです (AConnection は Variant 型変数です)。
AConnection:=CreateOleObject('A DODB.Connection')
接続の確立に使用されるメソッドは Open で、使用構文は次のとおりです (オブジェクト AConnection を例にします)。
AConnection.Open( ConnectionString, UserId, PassWord )
3 つのパラメータはすべて文字列型で、UserId と Password はユーザー名とユーザー パスワードです。ユーザー名とユーザー パスワードは ConnectionString にも指定できるため、データベースへのアクセスに使用する場合は省略できます。 ConnectionString は、ODBC データ ソース情報を記述するために使用される文字列です。その形式は次のとおりです。
'PROvider=プロバイダー名; DRIVER=サーバー; PWD=パスワード;
で:
プロバイダー: データプロバイダー、デフォルトでは 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('Driver= {Microsoft Access Driver (*.mdb)};DBQ=C:inetpub wwwroot est.mdb')
ADODB.Connection の確立後、操作結果 (削除、変更、更新など) を返す必要がない場合は、この時点で、ADODB.Connection の別のメソッドを使用してデータベースに対して通常の SQL 操作を実行できます。 、実行、構文は次のとおりです。
AConnection.Execute( strSQL );
このうち、strSQL は操作を実行する SQL ステートメントです。たとえば、削除操作は次のようになります。データベース接続を閉じるには、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: long integer、データセットのカーソルタイプ、オプションのパラメータはプログラム内のコメントを参照してください。
intLockType: long integer、データテーブルのロックタイプ、オプションのパラメータはプログラム内のコメントを参照してください。
intCommandType: strCommand の役割を示すために使用される長整数、コマンド (SQL ステートメントなど)、データ テーブル (TTable)、またはストアド プロシージャ (StoredProc) として指定できます。パラメータについては、プログラム内のコメントを参照してください。
SQL クエリを実行するには、次のステートメントを使用できます。
ARecordSet.Open('wfjcommu から * を選択',adOpenStatic,ad LockOptimistic,adCmdText);
TTable および TQuery と比較した他の一般的なプロパティとメソッドは次のとおりです (詳細については、ASP ヘルプ ファイルを参照してください)。
eof、bof: eof、bof。 MoveFirst、MoveLast: First、LastMovePrevious、MoveNext: Prior、NextMove: MoveByAddNew: appendUpdate: PostClose: close
削除と更新: 削除。データ テーブルに対するすべての変更は、操作を有効にするために Update を使用する必要があります。これは Delphi とは異なります。
フィールド[フィールド番号]: フィールド[フィールド番号]
フィールド['フィールド名']: FieldByName('フィールド名')
3. その他の共通オブジェクト (Delphi に対応するオブジェクト):
ADODB.フィールド: TField ADODB.Parameter: TPara ADODB.Error: EDBEngineError
ADODB.Command: なし ADODB.Property: なし
応用例を見てみましょう:
プロシージャ TForm1.Button1Click(送信者: 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; //バッチ更新中のレコードロック
変数
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('********data テーブルの元の内容は次のとおりです********');
{各ドメインのドメイン名を表示}
strTemp := '';
intIndex := 0 から ARecordSet.Fields.count - 1 の場合
strTemp := strTemp + ARecordSet.Fields[intIndex].name+';';
memo1.lines.add( strTemp );
{各ドメインのコンテンツを表示}
ARecordSet.eof ではありませんが、
始める
strTemp := '';
intIndex := 0 から ARecordSet.Fields.count - 1 の場合
strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';
memo1.lines.add( strTemp );
ARecordSet.MoveNext;//次のバーに移動、Next
終わり;
{レコードを追加}
ARecordSet.AddNew;//追加,追加
ARecordSet.Fields['AName'] := '1';//FieldByName によるアクセス
ARecordSet.Fields['ポータブル'] := '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 の場合
strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';
memo1.lines.add( strTemp );
ARecordSet.MoveNext;//次のバーに移動、Next
終わり;
{最後のレコードを変更}
ARecordSet.MoveLast;
ARecordSet.Fields['AName'] := '11';//FieldByName を使用してアクセス
ARecordSet.Fields['ポータブル'] := '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 の場合
strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';
memo1.lines.add( strTemp );
ARecordSet.MoveNext;//次のバーに移動、Next
終わり;
{最後のレコードを削除}
ARecordSet.MoveLast;//最後のバー、Last に移動
ARecordSet.delete;//削除、削除
ARecordSet.Update;//更新、Delphi では必要ありません
ARecordSet.MoveFirst;//最初の項目に移動します, First
memo1.lines.add('********最後のレコードを削除した後のデータテーブルの内容は以下の通り********');
{各ドメインのコンテンツを表示}
ARecordSet.eof ではありませんが、
始める
strTemp := '';
intIndex := 0 から ARecordSet.Fields.count - 1 の場合
strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';
memo1.lines.add( strTemp );
ARecordSet.MoveNext;//次のバーに移動、Next
終わり;
ARecordSet.Close;{データ セットを閉じる}
{SQL ステートメントを使用して、「Zhang San」という名前のレコードをクエリします}
{SQL ステートメントでは、文字列を一重引用符で囲む必要があることに注意してください}
ARecordSet.open( 'select * from wfjcommu where AName = ''Zhang San''',
AConnection、adOpenStatic、adLockOptimistic、adCmdText );
memo1.lines.add('********張三の内容は以下の通り********');
memo1.lines.add( '合計' + IntToStr( ARecordSet.RecordCount ) + '一致するレコード' );
{各ドメインのコンテンツを表示}
ARecordSet.eof ではありませんが、
始める
strTemp := '';
intIndex := 0 から ARecordSet.Fields.count - 1 の場合
strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';
memo1.lines.add( strTemp );
ARecordSet.MoveNext;//次のバーに移動、Next
終わり;
{データセットとデータベース接続を閉じる}
ARecordSet.close;
AConnection.close;
終わり;
他の人の話を聞くと、実際の例を見て自分で体験した方が良いです。この例では、ADO オブジェクトを使用して、データ テーブルのクエリ、レコードの追加、レコードの変更、およびレコードの削除を行う方法を示します。具体的な使用法については、プログラム内のコメントを参照してください。Delphi データベース プログラミングの経験があれば、理解するのは難しくないと思います。
この例で使用されるデータベースは Test.MDB で、これには wfjcommu というデータ テーブルがあり、AName、Portable、Tel、BP、PostAddress という 5 つのフィールドがあり、名前、携帯電話番号、電話番号、ポケベル番号、および郵送先住所を表します。それぞれ。
上記のプログラムはデバッグされ、PWIN98+ Delphi 3.0+PWS (Personal Web Server) 4.0 で渡されました。