1. DELPHIでアクセスデータベースを操作(.mdbファイルの作成、データベースの圧縮)
次のコードは、WIN2K、D6、MDAC2.6 でのテストに合格しました。
コンパイルされたプログラムは、ACCESS 環境なしの WIN98 の第 2 バージョンで正常に実行されます。
//ComObj,ActiveX を使用する前
//接続文字列を宣言する
定数
SConnectionString = 'PROvider=Microsoft.Jet.OLEDB.4.0;データ ソース=%s;'
+'Jet OLEDB:データベース パスワード=%s;';
//=============================================== =============================
// プロシージャ: GetTempPathFileName
// 作者: ysai
// 日付: 2003-01-27
// 引数:(なし)
// 結果: 文字列
//=============================================== =============================
関数 GetTempPathFileName():string;
//一時ファイル名を取得する
変数
SPath,SFile: 配列 [0..254] の char;
始める
GetTempPath(254,SPath);
GetTempFileName(SPath,'~SM',0,SFile);
結果:=Sファイル;
DeleteFile(PChar(結果));
終わり;
//=============================================== =============================
// プロシージャ: CreateAccessFile
// 作者: ysai
// 日付: 2003-01-27
// 引数: FileName:String;PassWord:string=''
// 結果: ブール値
//=============================================== =============================
function CreateAccessFile(FileName:String;PassWord:string=''):boolean;
// Access ファイルを作成します。ファイルが存在する場合は失敗します。
変数
STempFileName: 文字列;
vカタログ:OleVariant;
始める
STempFileName:=GetTempPathFileName;
試す
vCatalog:=CreateOleObject('ADOX.Catalog');
vCatalog.Create(format(SConnectionString,[STempFileName,PassWord]));
result:=CopyFile(PChar(STempFileName),PChar(FileName),True);
削除ファイル(STempファイル名);
を除外する
結果:= false;
終わり;
終わり;
//=============================================== =============================
// プロシージャ: CompactDatabase
// 作者: ysai
// 日付: 2003-01-27
// 引数: AFileName,APassWord:string
// 結果: ブール値
//=============================================== =============================
関数 CompactDatabase(AFileName,APassWord:string):boolean;
//データベースを圧縮して修復し、ソースファイルを上書きします
変数
STempFileName: 文字列;
vJE:OleVariant;
始める
STempFileName:=GetTempPathFileName;
試す
vJE:=CreateOleObject('JRO.JetEngine');
vJE.CompactDatabase(format(SConnectionString,[AFileName,APassWord]),
format(SConnectionString,[STempFileName,APassWord]));
result:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
削除ファイル(STempファイル名);
を除外する
結果:= false;
終わり;
終わり;
//=============================================== =============================
// プロシージャ:ChangeDatabasePassword
// 作者: ysai
// 日付: 2003-01-27
// 引数: AFileName,AOldPassWord,ANewPassWord:string
// 結果: ブール値
//=============================================== =============================
関数 ChangeDatabasePassword(AFileName,AOldPassWord,ANewPassWord:string):boolean;
//ACCESSデータベースのパスワードを変更する
変数
STempFileName: 文字列;
vJE:OleVariant;
始める
STempFileName:=GetTempPathFileName;
試す
vJE:=CreateOleObject('JRO.JetEngine');
vJE.CompactDatabase(format(SConnectionString,[AFileName,AOldPassWord]),
format(SConnectionString,[STempFileName,ANewPassWord]));
result:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
削除ファイル(STempファイル名);
を除外する
結果:= false;
終わり;
終わり;
2. ACCESSでSQL文を使用する際の注意点とヒント
次の SQL ステートメントは ACCESS XP でクエリを渡しました。
テーブルを作成します。
テーブル Tab1 の作成 (
IDカウンター、
名前文字列、
年齢の整数、
[日付] DateTime);
スキル:
自動インクリメントフィールドはCounterで宣言されます。
フィールド名がキーワードであるフィールドは角括弧 [] で囲まれており、フィールド名として数値も使用できます。
インデックスを作成します。
次のステートメントは、Tab1 の Date 列に反復可能なインデックスを作成します。
インデックス iDate ON Tab1 ([日付]) を作成します。
完了後、ACCESS のフィールドの日付インデックス属性は「はい (重複)」と表示されます。
次のステートメントは、Tab1 の Name 列に反復不可能なインデックスを作成します。
Tab1 (名前) に一意のインデックス iName を作成します。
完了後、ACCESSのフィールド名のインデックス属性は「-Yes(重複なし)」と表示されます。
次のステートメントは、作成したばかりの 2 つのインデックスを削除します。
Tab1 にインデックス iDate をドロップします。
Tab1 にインデックス iName をドロップします。
SQLSERVER の ACCESS ステートメントと UPDATE ステートメントの比較:
SQLSERVER 内の複数のテーブルを更新する UPDATE ステートメント:
タブ1を更新
SET a.名前 = b.名前
タブ 1 a、タブ 2 b から
ここで、a.ID = b.ID;
ACCESS で同じ機能を持つ SQL ステートメントは次のようになります。
UPDATE タブ 1 a、タブ 2 b
SET a.名前 = b.名前
ここで、a.ID = b.ID;
つまり、ACCESS の UPDATE ステートメントには FROM 句がなく、参照されるすべてのテーブルが UPDATE キーワードの後にリストされます。
上記の例で、Tab2 がテーブルではなくクエリである場合は、次のようになります。
UPDATE Tab1 a,(Tab2 から ID、名前を選択) b
SET a.名前 = b.名前
ここで、a.ID = b.ID;
複数の異なる ACCESS データベースにアクセスします。SQL で In 句を使用します。
Tab1 a,Tab2 b から a.*,b.* を選択します。 'db2.mdb' の場合、a.ID=b.ID;
上記の SQL ステートメントは、現在のデータベースの Tab1 および db2.mdb (現在のフォルダー内) の Tab2 に関連付けられているすべてのレコードをクエリします。
欠点 - 外部データベースにはパスワードを設定できません。
補足:ugvanxkさんのリプライを投稿で拝見したので使用させていただきます
[c:/aa/a.mdb;pwd=1111].table1 から * を選択します。
ACCESS XP テストに合格しました
ACCESS で他の ODBC データ ソースにアクセスする
次の例では、ACCESS で SQLSERVER のデータをクエリします。
SELECT * FROM Tab1 IN [ODBC]
[ODBC;ドライバー=SQL Server;UID=sa;PWD=;サーバー=127.0.0.1;データベース=デモ;]
外部データ ソース接続プロパティの完全なパラメーターは次のとおりです。
[ODBC;DRIVER=ドライバー;SERVER=サーバー;DATABASE=データベース;UID=ユーザー;PWD=パスワード;]
DRIVER=ドライバーはレジストリにあります
HKEY_LOCAL_MACHINE/ソフトウェア/ODBC/ODBCINST.INI/
で見つかりました
異種データベース間のデータインポートについては、Blue Blood Sword を参照してください。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1691966
ACCESSはサブクエリをサポートします
ACCESS は外部結合をサポートしますが、サポートされている場合は完全な外部結合は含まれません。
左結合または右結合
しかしサポートされていません
完全外部結合または完全結合
ACCESSの日付クエリ
注: ACCESS の日付と時刻の区切り文字は引用符ではなく # です。
* From Tab1 Where [日付]>#2002-1-1#; を選択します。
DELPHIではこれを使用します
SQL.Add(フォーマット(
'選択 * From Tab1 Where [日付]>#%s#;',
[DateToStr(日付)]));
ACCESS の文字列は二重引用符で区切ることができますが、SQLSERVER では文字列が認識されないため、移行と互換性の便宜上、
文字列区切り文字として一重引用符を使用することをお勧めします。