1. Delphiでアクセスデータベースを操作(.mdbファイルの作成、データベースの圧縮)
次のコードは、win2k、d6、および mdac2.6 でテストされています。
コンパイルされたプログラムは、アクセス環境なしで win98 の第 2 バージョンで正常に実行されます。
//comobj,activex を使用する前に
//接続文字列を宣言する
定数
接続文字列 = 'プロバイダ=microsoft.jet.oldb.4.0;データ ソース=%s;'
+'jet oledb:データベースパスワード=%s;';
//=============================================== =============================
// プロシージャ: gettemppathfilename
// 作者: ysai
// 日付 : 2003-01-27
// 引数:(なし)
// 結果: 文字列
//=============================================== =============================
関数 gettemppathfilename():string;
//一時ファイル名を取得する
変数
spath,sfile&:array [0..254] の char;
始める
gettemppath(254,spath);
gettempfilename(spath,'~sm',0,sfile);
結果:=ファイル;
deletefile(pchar(結果));
終わり;
//=============================================== =============================
// プロシージャ: createaccessfile
// 作者: ysai
// 日付 : 2003-01-27
// 引数: ファイル名:文字列;パスワード:文字列=''
// 結果: ブール値
//=============================================== =============================
function createaccessfile(ファイル名:文字列;パスワード:文字列=''):ブール;
//アクセスファイルを作成、ファイルが存在する場合は失敗
変数
テンプレートファイル名:文字列;
vcatalog:オレバリアント;
始める
stempfilename:=gettemppathfilename;
試す
vcatalog:=createoleobject('adox.catalog');
vcatalog.create(format(接続文字列,[テンプレートファイル名,パスワード]));
result:=copyfile(pchar(stempfilename),pchar(filename),true);
削除ファイル(テンプレートファイル名);
を除外する
結果:= false;
終わり;
終わり;
//=============================================== =============================
// プロシージャ: コンパクトデータベース
// 作者: ysai
// 日付 : 2003-01-27
// 引数: ファイル名、パスワード:文字列
// 結果: ブール値
//=============================================== =============================
関数コンパクトデータベース(ファイル名、パスワード:文字列):ブール値;
//データベースを圧縮して修復し、ソースファイルを上書きします
変数
テンプレートファイル名:文字列;
vje:オレバリアント;
始める
stempfilename:=gettemppathfilename;
試す
vje:=createoleobject('jro.jetengine');
vje.compactdatabase(format(接続文字列,[ファイル名,パスワード]),
format(sconnectionstring,[stempfilename,apassword]));
result:=copyfile(pchar(stempfilename),pchar(afilename),false);
削除ファイル(テンプレートファイル名);
を除外する
結果:= false;
終わり;
終わり;
//=============================================== =============================
// プロシージャ:データベースパスワードの変更
// 作者: ysai
// 日付 : 2003-01-27
// 引数: ファイル名、古いパスワード、新しいパスワード:文字列
// 結果: ブール値
//=============================================== =============================
関数changedatabasepassword(ファイル名,古いパスワード,新しいパスワード:文字列):ブール値;
//アクセスデータベースのパスワードを変更します
変数
テンプレートファイル名:文字列;
vje:オレバリアント;
始める
stempfilename:=gettemppathfilename;
試す
vje:=createoleobject('jro.jetengine');
vje.compactdatabase(format(接続文字列,[ファイル名,古いパスワード]),
format(sconnectionstring,[stempfilename,新しいパスワード]));
result:=copyfile(pchar(stempfilename),pchar(afilename),false);
削除ファイル(テンプレートファイル名);
を除外する
結果:= false;
終わり;
終わり;
2. AccessでSQL文を使用する際の注意点とコツ
次の SQL ステートメントは、Access XP クエリのテストに合格しました。
テーブルを作成します。
テーブル tab1 を作成 (
IDカウンター、
名前文字列、
年齢の整数、
[日付] 日時);
スキル:
自動インクリメントフィールドはカウンターで宣言されます。
フィールド名がキーワードであるフィールドは角括弧 [] で囲まれており、フィールド名として数値も使用できます。
インデックスを作成します。
次のステートメントは、tab1 の日付列に反復可能なインデックスを作成します。
tab1 にインデックス ID を作成します ([日付]);
完了後、アクセス中のフィールドの日付インデックス属性は「はい」と表示されます(重複があります)。
次のステートメントは、tab1 の name 列に反復不可能なインデックスを作成します。
tab1 (name) に一意のインデックス iname を作成します。
完了後、アクセス時のフィールド名のインデックス属性は「-Yes(重複なし)」と表示されます。
次のステートメントは、作成したばかりの 2 つのインデックスを削除します。
tab1 のインデックス ID を削除します。
tab1 のインデックス iname を削除します。
access と sqlserver の update ステートメントの比較:
SQLserver 内の複数のテーブルを更新する Update ステートメント:
タブ1を更新
a.name = b.name を設定します
タブ1 a、タブ2 bから
ここで、a.id = b.id;
Access で同じ関数を持つ SQL ステートメントは次のようにする必要があります。
tab1 a、tab2 bを更新します
a.name = b.name を設定します
ここで、a.id = b.id;
つまり、Access の update ステートメントには from 句がなく、参照されるすべてのテーブルが update キーワードの後にリストされます。
上記の例で、tab2 がテーブルではなくクエリである場合は、次のようになります。
tab1 aを更新、(tab2からID、名前を選択) b
a.name = b.name を設定します
ここで、a.id = b.id;
複数の異なるアクセス データベースにアクセスします - SQL で in 句を使用します。
a.id=b.id である「db2.mdb」の tab1 a,tab2 b から a.*,b.* を選択します。
上記の SQL ステートメントは、現在のデータベースの tab1 および db2.mdb (現在のフォルダー内) の tab2 に関連付けられているすべてのレコードをクエリします。
欠点 - 外部データベースにはパスワードを設定できません。
補足:ugvanxkさんのリプライを投稿で拝見したので使用させていただきます
select * from [c:/aa/a.mdb;pwd=1111].table1;
アクセスXPテストに合格しました
Access で他の odbc データ ソースにアクセスする
次の例では、Access で sqlserver のデータをクエリします。
[odbc] の tab1 から * を選択します
[odbc;ドライバー=SQLサーバー;uid=sa;pwd=;サーバー=127.0.0.1;データベース=デモ;]
外部データ ソース接続プロパティの完全なパラメーターは次のとおりです。
[odbc;ドライバー=ドライバー;サーバー=サーバー;データベース=データベース;uid=ユーザー;pwd=パスワード;]
driver=driver はレジストリにあります。
hkey_local_machine/software/odbc/odbcinst.ini/
で見つかりました
異種データベース間のデータインポートについては、Blue Blood Sword を参照してください。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1691966
アクセスはサブクエリをサポートします
アクセスは外部結合をサポートしますが、サポートされている場合でも完全な外部結合は含まれません。
左結合または右結合
しかしサポートされていません
完全外部結合または完全結合
Access の日付クエリ
注: アクセス時の日付と時刻の区切り文字は引用符ではなく # です。
select * from tab1 where [日付]>#2002-1-1#;
Delphiではこれを使用します
sql.add(フォーマット(
'select * from tab1 where [日付]>#%s#;',
[datetostr(日付)]));
Access 内の文字列は二重引用符で区切ることができますが、sqlserver はそれらを認識しないため、移行と互換性の便宜のために、
文字列区切り文字として一重引用符を使用することをお勧めします。