DELPHI データベース アプリケーションでは、通常、データベースにアクセスする方法が 2 つあります。 1 つは BDE データベースを検索することです
エンジン、つまり DELPHI に付属のデータベース ドライバーを使用するこの方法の利点は高速であることですが、その適用範囲は限られています。
データベースのバージョンが更新されると、新しいデータベースを操作できなくなる可能性があります。ODBC を使用する方法もあります。これには利点があります。
OS(WINDOWSなど)で提供でき、標準インターフェースとして様々なデータベースに対応できるのがポイントですが、遅いのが欠点です。準備中
プロセス中に、ニーズに応じていずれかの方法を選択できます。
ODBC を使用してデータベースにアクセスする場合、通常の方法は、ODBC 管理パネルで ODBC システム データ ソースを設定することです。
(システム DSN) を選択し、DSN に対応するように DBD またはプログラム内でデータベース エイリアス (Alias) を設定します。これにより、使用できるようになります。
データベースの操作が簡単に行えます。 DELPHI を使用してデータベース アプリケーションを実行したことのあるプログラマは、この点についてすでによく知っていると思いますが、私が知っているプログラマはそれほど多くありません。
言った。実際のアプリケーションでは、著者はこのような状況に遭遇しました。私たちのデータベース アプリケーションは ODBC システム データ ソースに依存しています。
データベースにアクセスして操作するアプリケーションプログラムは、ある日まで、WINDOWS システムには詳しくても、Windows システムに詳しくない人でも問題なく動作していました。
あまりにも精通したユーザーが、プリセット システム DSN を誤って変更または削除してしまいます...
そこで、筆者は独自のプログラムを増やすために、ODBC システムの DSN の内容をプログラム内で動的に設定する方法を検討し始めました。
順序はしっかりしています。丸一日かけて WINDOWS レジストリを調査した結果、ついに ODBC マネージャーを使用して DSN を設定する秘密を見つけました。
(「天地には正義があり、努力は必ず報われる!」これは宣伝ではありません!) 皆さんに共有したく、専門家のアドバイスも求めて書き綴っています。
ODBC 管理プログラムによって設定された DSN の秘密はレジストリにあります。信じられない場合は、HKEY_LOCAL_MACHINESoftwareODBC にアクセスしてください。
見てみると、すでに半分成功したような気分になること間違いありません。
まず、システムにインストールされている ODBC データベース ドライバーを見てみましょう。 HKEY_LOCAL_MACHINESoftwareODBC 内
ODBCInst.INI には、インストールされている ODBC データベース ドライバーに関する情報が保存されており、ここからインストールされている ODBC 番号を確認できます。
データベースドライバーに対応するDLLファイルなどの情報。 ODBCInst.INIODBC Drivers の各キー値では、キー名がドライバーです。
名前 (Microsoft access Driver (*.mdb) など) とキーの値は「Installed」で、ドライバーがインストールされていることを示します。存在する
ODBCInst.INIDriverName (DriverName は Microsoft Access Driver (*.mdb) などのドライバー名です)
、ドライバーに関する詳細情報があり、ここから主に ODBC ドライバーに対応する DLL ファイルのパスとファイル名を取得します。
キー名 Driver のキー値は通常「C:WINDOWSSYSTEMFileName.DLL」です。
次に、HKEY_LOCAL_MACHINESoftwareODBCODBC.INI にシステムが保存されているシステム DSN の登録情報を確認します。
DSNの登録情報、ODBC管理パネルで設定したDSNパラメータはこちらです。
ODBC 管理パネルでパラメータ設定を完了した後、ODBC システム DSN を作成する手順を見てみましょう。
プログラムはどのように DSN 情報をレジストリに登録しますか?例として、MyAccess という名前の Ms Access97 タイプのシステム DSN を作成します。
指定するパラメータには主にデータベースの種類 (Microsoft Access Driver (*.mdb))、データ ソース名 (MyAccess)、
データ ソースの説明 (My ACCESS)、データベース パス (C:InetpubwwwrootTest.mdb)、ユーザー名などのその他のパラメーター、
ユーザーパスワード、排他的、読み取り専用、システムデータベース、デフォルトディレクトリ、バッファサイズ、走査線数、ページタイムアウトなどのシステム使用
デフォルトのパラメータ。現時点では、登録システム DSN には通常、次の手順が必要です。
1. HKEY_LOCAL_MACHINESoftwareODBCODBC.INIODBC データ ソースに文字列キーを追加します。
値は MyAccess = Microsoft Access Driver(*.mdb) です。ここで、 はそれぞれデータ ソース名とデータベースの種類です。
システムDSN名をレジストリに登録します。
2. HKEY_LOCAL_MACHINESoftwareODBCODBC.INI にサブキー (SubKey) MyAccess を作成します。つまり、
HKEY_LOCAL_MACHINESoftwareODBCODBC.INIMyAccess としてキーを作成し、いくつかのキーを作成します。
システム DSN の構成情報を詳細に記述するキー値。主な情報は次のとおりです ([] 内の内容は作成者のコメントです)。
DBQ=C:InetpubwwwrootTest.mdb [データベース パスを示す文字列]
説明=My ACCESS [データベースの説明を表す文字列]
Driver=C:PWIN98Systemodbcjt32.dll [ドライバーを示す文字列、ODBCINST.INI が表示される]
DriverId=0x00000019(25) [ドライバーの識別を示す番号は変更できません]
FIL=Ms Access; [文字列、フィルタに関連している可能性があります]
SafeTransaction=0x00000000 [数値、サポートされるトランザクション操作の数を示す場合があります]
UID="" [ユーザー名を示す文字列。ここでは空の文字列]
3. HKEY_LOCAL_MACHINESoftwareODBCODBC.INIMyAccess にサブキー (SubKey)Engines を作成します。
次に、その下にサブキー (SubKey)Jet を作成します。つまり、次のようにキーを作成します。
HKEY_LOCAL_MACHINESoftwareODBCODBC.INIMyAccessEnginesJet を作成し、その下にいくつか作成します
システム DSN のデータベース エンジン構成情報を詳細に記述するキー値。主な情報は次のとおりです ([] 内の内容は作成者の注釈です)。
ImplicitCommitSync=Yes [文字列。データの変更が即時に反映されるかどうかを示す場合があります]
MaxBufferSize=0x00000200(512) [バッファサイズを示す数値]
PageTimeout=0x00000005(5) [ページタイムアウトを示す数値]
Threads=0x00000003(3) [サポートされるスレッドの最大数を示す数値]
UserCommitSync=Yes [文字列。データの変更がユーザーに直ちに反映されるかどうかを示す場合があります]
上記はシステム DSN を確立するための基本情報です (オプションや詳細オプションなどの他の情報もここで設定しますが、デフォルトでは
情報(レジストリにリストされていない情報))を取得するには、プログラムの上記の手順に従ってレジストリを操作し、システム DSN を追加したり、その構成を変更したりすることもできます。
次のプログラム例では、上記の手順に従ってシステム DSN が作成されます。プログラム内のコメントに注意してください。
{************************************************ * ***
この手順では、ODBC システム データ ソース (DSN) が作成されます。
データ ソース名: MyAccess データ ソースの説明: 私の新しいデータ ソース
データベースの種類:ACCESS97
対応するデータベース: C:Inetpubwwwroot est.mdb
************************************************* * *****}
{レジストリはUSESステートメントに含める必要があることに注意してください}
手順 TForm1.Button1Click(送信者: TObject);
変数
registerTemp : TRegistry;
bData : バイトの配列[ 0..0 ]。
始める
registerTemp := TRegistry.Create // レジストリ インスタンスを作成します。
registerTemp を使用して行う
始める
RootKey:=HKEY_LOCAL_MACHINE;//ルート キーの値を HKEY_LOCAL_MACHINE に設定します
// ソフトウェアODBCODBC.INIODBC データ ソースを検索します
if OpenKey('SoftwareODBCODBC.INIODBC データ ソース',True) then
begin //DSN名を登録します
WriteString( 'MyAccess', 'Microsoft Access Driver (*.mdb)' );
終わり
それ以外
begin//キー値の作成に失敗しました
memo1.lines.add('ODBC データ ソースの追加に失敗しました');
出口;
終わり;
閉じるキー;
//SoftwareODBCODBC.INIMyAccess を検索または作成し、DSN 構成情報を書き込みます
if OpenKey('SoftwareODBCODBC.INIMyAccess',True) then
始める
WriteString( 'DBQ', 'C:inetpubwwwroot est.mdb' );//データベースディレクトリ
WriteString( 'Description', 'My new data source' );// データ ソースの説明
WriteString( 'Driver', 'C:PWIN98SYSTEModbcjt32.dll' );//ドライバー DLL ファイル
WriteInteger( 'DriverId', 25 );//ドライバーID
WriteString( 'FIL', 'Ms Access;' );// フィルタベース
WriteInteger( 'SafeTransaction', 0 );//サポートされるトランザクション操作の数
WriteString( 'UID', ' );//ユーザー名
bデータ[0] := 0;
WriteBinaryData( 'Exclusive', bData, 1 );// 非排他モード
WriteBinaryData( 'ReadOnly', bData, 1 );// 非読み取り専用モード
終わり
else//キー値の作成に失敗しました
始める
memo1.lines.add('ODBC データ ソースの追加に失敗しました');
出口;
終わり;
閉じるキー;
//SoftwareODBCODBC.INIMyAccessEnginesJet を検索または作成します
//DSN データベース エンジンの構成情報を書き込みます
if OpenKey('SoftwareODBCODBC.INIMyAccessEnginesJet',True) then
始める
WriteString( 'ImplicitCommitSync', 'Yes' );
WriteInteger( 'MaxBufferSize', 512 );// バッファサイズ
WriteInteger( 'PageTimeout', 10 );
WriteInteger( 'Threads', 3 );// サポートされるスレッドの数
WriteString( 'UserCommitSync', 'Yes' );
終わり
else//キー値の作成に失敗しました
始める
memo1.lines.add('ODBC データ ソースの追加に失敗しました');
出口;
終わり;
閉じるキー;
memo1.lines.add('新しい ODBC データ ソースを正常に追加しました');
無料;
終わり;
終わり;
上記のプログラムはデバッグされ、PWIN98+DELPHI3.0 で渡されました。
一般的なデータベース タイプの DSN を作成するために設定する必要がある情報は次のとおりです ([] はコメントの内容です。特別なコメントを除き、各パラメーターは前の説明で確認できます)。
1. Access(Microsoft Access ドライバー(*.mdb))
DBQ、説明、ドライバー[odbcjt32.dll]、ドライバーID[25]、FIL[Ms Access;]、
SafeTransaction [デフォルトは 0]、UID [デフォルトは空]、
EnginesJetImplicitCommitSync[デフォルトはYes]、EnginesJetMaxBufferSize[デフォルトは512]、
EnginesJetPageTimeout[デフォルトは 512]、EnginesJetThreads[デフォルトは 3]、
EnginesJetUserCommitSync [デフォルトははい]
オプションの設定: SystemDb[文字列、システム データベースへのパス]、
ReadOnly[バイナリ、読み取り専用モードで開くかどうか、1 ははいを意味し、デフォルトは 0]、
Exclusive[バイナリ、排他モードで開くかどうか、1 ははいを意味、デフォルトは 0]、
PWD [文字列、ユーザーパスワード]
2. Excel(Microsoft Excelドライバー(*.xls))
DBQ[Excel97(=pathxxx.xls)、5.0/7.0(=pathxxx.xls)、4.0(=パス)、3.0(=パス)]、
説明、ドライバー[odbcjt32.dll]、
DefaultDir[Excel97(<>DBQ),5.0/7.0(<>DBQ),4.0(=DBQ),3.0(=DBQ)],
ドライバーID[790(Excel97)、22(5.0/7.0)、278(4.0)、534(3.0)]、
FIL[Excel5.0;]、ReadOnly、SafeTransaction、UID、
EnginesExcelImplicitCommitSync、EnginesExcelMaxScanRows[数値、スキャンされた行数、デフォルトは 8]、
EnginesExcelThreads、EnginesExcelUserCommitSync、
EnginesExcelFirstRowHasName[バイナリ、最初の行がドメイン名であるかどうか、1 ははいを意味し、デフォルトは 1]
注: Excel97 および Excel7.0/5.0 の DBQ は XLS ファイルに対応し、Excel4.0 および Excel3.0 はディレクトリに対応します。
DefaultDir はディレクトリに相当し、Excel97、Excel7.0/5.0 では DBQ に相当するパスになります。
Excel4.0 および Excel3.0 の DBQ と同じですが、各バージョンの DriverID は異なります。
3. dBase(Microsoft dBase ドライバー(*.dbf))
DefaultDir[文字列、データベース ファイルが配置されているディレクトリ]、説明、ドライバー[odbcjt32.dll]、
ドライバーID[277(IV)、533(5.0)]、FIL[dbase III;]、SafeTransaction、UID、
EnginesXbaseImplicitCommitSync、
EnginesXbaseCollating[文字列、ソート基準、ASCII、インターナショナル、ノルウェー デンマーク語、
スウェーデン語-フィンランド語]、
EnginesXbaseDeleted[バイナリ、論理的に削除されたレコードを表示しないかどうか、0 は表示を意味、デフォルトは 1]、
EnginesXbasePageTimeout[デフォルトは 600]、EnginesXbaseUserCommitSync、
EnginesXbaseThreads、EnginesXbaseStatistics [バイナリ、おおよその行数を使用するかどうか、1 ははい、デフォルトは 0]
注: (dBaseIV と dBase5.0 の 2 つのバージョンの DriverId は異なります)
4. Foxpro(Microsoft Foxpro ドライバー(*.dbf))
DefaultDir[データベース ファイルが配置されているディレクトリ]、説明、ドライバー[odbcjt32.dll]、
ドライバーID[536(2.6)、280(2.5)]、FIL[Foxpro 2.0;]、SafeTransaction、UID、
EnginesXbaseCollating[文字列、ソート基準、ASCII、インターナショナルも可能]、
EnginesXbaseDeleted[バイナリ、論理的に削除されたレコードを表示しないかどうか、0 は表示を意味、デフォルトは 1]、
EnginesXbasePageTimeout[デフォルトは 600]、EnginesXbaseUserCommitSync、
EnginesXbaseThreads、EnginesXbaseStatistics [バイナリ、おおよその行数を使用するかどうか、1 ははい、デフォルトは 0]
注: (Foxpro2.5 と Foxpro2.6 の DriverId は異なります)
上記のプログラムを COM または ActiveX コントロールに作成します。これは、DELPHI、C++Buider、VB、VC、PB などの多くの高級プログラミング言語で使用できます。