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_MACHINE/Software/ODBC にアクセスしてください。 見てみると、すでに半分成功したような気分になること間違いありません。 まず、システムにインストールされている ODBC データベース ドライバーを見てみましょう。 HKEY_LOCAL_MACHINE/ソフトウェア/ODBC/ 内 ODBCInst.INI には、インストールされている ODBC データベース ドライバーに関する情報が保存されており、ここからインストールされている ODBC 番号を確認できます。 データベースドライバーに対応するDLLファイルなどの情報。 ODBCInst.INI/ODBC Drivers の各キー値では、キー名がドライバーです 名前 (Microsoft access Driver (*.mdb) など) とキーの値は「Installed」で、ドライバーがインストールされていることを示します。存在する ODBCInst.INI/DriverName (DriverName は Microsoft Access Driver (*.mdb) などのドライバー名です) 、ドライバーに関する詳細情報があり、ここから主に ODBC ドライバーに対応する DLL ファイルのパスとファイル名を取得します。 キー名 Driver のキー値は通常「C:/WINDOWS/SYSTEM/FileName.DLL」です。 次に、HKEY_LOCAL_MACHINE/Software/ODBC/ODBC.INI にシステムが保存されているシステム DSN の登録情報を確認します。 DSNの登録情報、ODBC管理パネルで設定したDSNパラメータはこちらです。 ODBC 管理パネルでパラメータ設定を完了した後、ODBC システム DSN を作成する手順を見てみましょう。 プログラムはどのように DSN 情報をレジストリに登録しますか?例として、MyAccess という名前の Ms Access97 タイプのシステム DSN を作成します。 指定するパラメータには主にデータベースの種類 (Microsoft Access Driver (*.mdb))、データ ソース名 (MyAccess)、 データ ソースの説明 (My ACCESS)、データベース パス (C:/Inetpub/wwwroot/Test.mdb)、ユーザー名などのその他のパラメーター、 ユーザーパスワード、排他的、読み取り専用、システムデータベース、デフォルトディレクトリ、バッファサイズ、走査線数、ページタイムアウトなどのシステム使用 デフォルトのパラメータ。現時点では、登録システム DSN には通常、次の手順が必要です。 1. HKEY_LOCAL_MACHINE/Software/ODBC/ODBC.INI/ODBC データ ソースに文字列キーを追加します。 値は MyAccess = Microsoft Access Driver(*.mdb) です。ここで、 はそれぞれデータ ソース名とデータベースの種類です。 システムDSN名をレジストリに登録します。 2. HKEY_LOCAL_MACHINE/Software/ODBC/ODBC.INI にサブキー (SubKey) MyAccess を作成します。つまり、 HKEY_LOCAL_MACHINE/Software/ODBC/ODBC.INI/MyAccess としてキーを作成し、いくつかのキーを作成します。 キー値、システム DSN の構成情報の詳細な説明。主な情報は次のとおりです ([] 内の内容は作成者のコメントです)。 DBQ=C:/Inetpub/wwwroot/Test.mdb [データベース パスを示す文字列] 説明=My ACCESS [データベースの説明を表す文字列] Driver=C:/PWIN98/System/odbcjt32.dll [ドライバーを示す文字列、ODBCINST.INI が表示される] DriverId=0x00000019(25) [ドライバーの識別を示す番号は変更できません] FIL=Ms Access; [文字列、フィルタに関連している可能性があります] SafeTransaction=0x00000000 [数値、サポートされるトランザクション操作の数を示す場合があります] UID="" [ユーザー名を示す文字列。ここでは空の文字列] 3. HKEY_LOCAL_MACHINE/Software/ODBC/ODBC.INI/MyAccess にサブキー (SubKey)Engines を作成します。 次に、その下にサブキー (SubKey) Jet を作成します。つまり、キーを次のように作成します。 HKEY_LOCAL_MACHINE/Software/ODBC/ODBC.INI/MyAccess/Engines/Jet その下にいくつか作成します システム DSN のデータベース エンジン構成情報を詳細に記述するキー値。主な情報は次のとおりです ([] 内の内容は作成者の注釈です)。 ImplicitCommitSync=Yes [文字列。データの変更が即時に反映されるかどうかを示す場合があります] MaxBufferSize=0x00000200(512) [バッファサイズを示す数値] PageTimeout=0x00000005(5) [ページタイムアウトを示す数値] Threads=0x00000003(3) [サポートされるスレッドの最大数を示す数値] UserCommitSync=Yes [文字列。データの変更がユーザーに即座に反映されるかどうかを示す場合があります] 上記はシステム DSN を確立するための基本情報です (オプションや詳細オプションなどの他の情報もここで設定しますが、デフォルトでは レジストリに記載されていない情報)を取得するには、プログラムの上記の手順に従ってレジストリを操作します。また、システム DSN を追加したり、その構成を変更したりすることもできます。 次のプログラム例では、上記の手順に従ってシステム DSN が作成されます。プログラム内のコメントに注意してください。 {************************************************ ***** ****** この手順では、ODBC システム データ ソース (DSN) が作成されます。 データ ソース名: MyAccess データ ソースの説明: 私の新しいデータ ソース データベースの種類:ACCESS97 対応するデータベース: C:/Inetpub/wwwroot/test.mdb ************************************************* * *****} {レジストリはUSESステートメントに含める必要があることに注意してください} 手順 TForm1.Button1Click(送信者: TObject); 変数 registerTemp : TRegistry; bData : バイトの配列[ 0..0 ]。 始める registerTemp := TRegistry.Create // レジストリ インスタンスを作成します。 registerTemp を使用して行う 始める RootKey:=HKEY_LOCAL_MACHINE;//ルート キーの値を HKEY_LOCAL_MACHINE に設定します //ソフトウェア/ODBC/ODBC.INI/ODBC データ ソースを検索します if OpenKey('ソフトウェア/ODBC/ODBC.INI/ODBC データ ソース',True) then begin //DSN名を登録します WriteString( 'MyAccess', 'Microsoft Access Driver (*.mdb)' ); 終わり それ以外 begin//キー値の作成に失敗しました memo1.lines.add('ODBC データ ソースの追加に失敗しました'); 出口; 終わり; 閉じるキー; //Software/ODBC/ODBC.INI/MyAccess を検索または作成し、DSN 構成情報を書き込みます if OpenKey('ソフトウェア/ODBC/ODBC.INI/MyAccess',True) then 始める WriteString( 'DBQ', 'C:/inetpub/wwwroot/test.mdb' );//データベースディレクトリ WriteString( 'Description', 'My new data source' );// データ ソースの説明 WriteString( 'Driver', 'C:/PWIN98/SYSTEM/odbcjt32.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 データ ソースの追加に失敗しました'); 出口; 終わり; 閉じるキー; //Software/ODBC/ODBC.INI/MyAccess/Engines/Jet を検索または作成します //DSN データベース エンジンの構成情報を書き込みます if OpenKey('Software/ODBC/ODBC.INI/MyAccess/Engines/Jet',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 [デフォルトは空]、 Engines/Jet/ImplicitCommitSync[デフォルトは Yes]、Engines/Jet/MaxBufferSize[デフォルト 512]、 Engines/Jet/PageTimeout[デフォルトは 512]、Engines/Jet/Threads[デフォルトは 3]、 Engines/Jet/UserCommitSync [デフォルトはYes] オプションの設定: SystemDb[文字列、システム データベースへのパス]、 ReadOnly[バイナリ、読み取り専用モードで開くかどうか、1 ははいを意味し、デフォルトは 0]、 Exclusive[バイナリ、排他モードで開くかどうか、1 ははい、デフォルトは 0]、 PWD [文字列、ユーザーパスワード] 2. Excel(Microsoft Excelドライバー(*.xls)) DBQ[Excel97(=パス/xxx.xls)、5.0/7.0(=パス/xxx.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、 Engines/Excel/ImplicitCommitSync、Engines/Excel/MaxScanRows[数値、スキャンされた行数、デフォルトは 8]、 エンジン/Excel/スレッド、エンジン/Excel/UserCommitSync、 Engines/Excel/FirstRowHasName[バイナリ、最初の行がドメイン名であるかどうか、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、 エンジン/Xbase/ImplicitCommitSync、 Engines/Xbase/Collating[文字列、ソート基準、ASCII、インターナショナル、ノルウェー - デンマーク語、 スウェーデン語-フィンランド語]、 Engines/Xbase/Deleted[バイナリ、論理的に削除されたレコードを表示しないかどうか、0 は表示を意味、デフォルトは 1]、 Engines/Xbase/PageTimeout[デフォルトは 600]、Engines/Xbase/UserCommitSync、 Engines/Xbase/Threads、Engines/Xbase/Statistics [バイナリ、おおよその行数を使用するかどうか、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、 Engines/Xbase/Collating[文字列、ソート基準、ASCII、インターナショナルも可能]、 Engines/Xbase/Deleted[バイナリ、論理的に削除されたレコードを表示しないかどうか、0 は表示を意味、デフォルトは 1]、 Engines/Xbase/PageTimeout[デフォルトは 600]、Engines/Xbase/UserCommitSync、 Engines/Xbase/Threads、Engines/Xbase/Statistics [バイナリ、おおよその行数を使用するかどうか、1 ははいを意味、デフォルトは 0] 注: (Foxpro2.5 バージョンと Foxpro2.6 バージョンの DriverId は異なります) 上記のプログラムを COM または ActiveX コントロールに作成します。これは、DELPHI、C++Buider、VB、VC、PB などの多くの高級プログラミング言語で使用できます。 |