2012-01-27 17 views
0

私は、Accessデータベースを利用するVB .NETアプリケーションのサポートを引き継いだ。このアプリケーションを作成した開発者は、データベース内のテーブルの主キー列に一意のインデックスを作成していないことがわかりました。したがって、プライマリキーフィールドのどれも実際にアクセスのプライマリキーとしてフラグが立てられていないため、Accessによって重複チェックが実行されていません。さらに、主キー列はAccessのオートナンバー型で自動インクリメントされません。開発者は次のようなクエリを使用してテーブルに行を挿入しています。Accessデータベース(DDL)のバッチ更新。可能?

INSERT INTO Users(pkid、FirstName、Surname、City) SELECT iif(isnull(max(pkid))、0、max(pkid))+1、[@strFirstName]、[@strSurname]、[@strCity]、 FROM Users;

このアプリケーションは、一般にアプリケーションを同時に使用するネットワークアプリケーションとして実行され、すでに述べた設計上の問題と組み合わされているため、複数のユーザーに同じプライマリキー値が割り当てられています。これは==大きな問題です。 :(

私はこれを並べ替える必要があります(私は今週末に何をやっているのでしょうか?)。私はおそらく、アクセス挿入クエリを呼び出すコードの周りにミューテックスを使用すると考えています。しかし、最終的には、データベースを修正して適切なプライマリキー値を設定したいと思っていますが、アプリケーションは現在約15の異なるサイトで動作していますので、何らかのバッチを実行する必要があります

私はアクセスに精通していません(これは初めて私がアクセスを使用しています)。これは少しの質問ではありますが、申し訳ありませんが、私はすぐに解決策が必要です。私がよく知っているSybaseまたはMSSqlデータベースでこの問題が発生した場合、SQLバッチを作成します。データベースを修正するために必要なDDLコマンドだから問題は、Accessでバッチファイルから起動できるSQLスクリプトを作成することが可能なのでしょうか?そうでない場合、それぞれのデータベースを更新する異なるサイトで実行可能な「パッチ」を作成するにはどうすればよいでしょうか。

答えて

4

VBAでSQLを簡単に実行できますが、フィールドをautoincrementに一度変更できないため、現在のID列の代わりに自動インクリメントで空のAccessデータベースを作成してすべてのデータを追加するのが最も簡単だと思いますそれはあらゆるデータを含んでいます。

+0

ありがとう、Remou。私はこの道を行く。 – BruceHill

0

アクセスはファイルベースのデータベースなので、DDLへの更新を送信する場合は、新しい.mdbを送信します。

+0

これは当てはまりません。 Microsoft AccessはDDLコマンドをサポートしています。[リンク](http://msdn.microsoft.com/en-us/library/bb267262(v=office.12).aspx) Microsoft Accessはファイルベースなので、DDLのサポートとはまったく関係がありません。 – codechurn

+0

私のWindows Scriptongの例を参照してください。私の例に示すように、PKカラムを追加するためにあなたのWindowsボックスにAccessをインストールする必要はありません。 –

+0

はい、それはDDLコマンドをサポートしていますが、新しいmdbを作成する方が、ddlのすべての変更を把握してすべてのものを正しく作ってくれるよりも、古いものよりも簡単にmdbを作成する方が簡単です。サーバーベースのデータベースは異なります。新しいデータベースを電子メールに添付して、既存のファイルを置き換えるという選択肢はありません。 – Beth

0

実際には、Windowsスクリプトを使用することができます。メモ帳に次のように入力し、ADDPK.vbsとして保存します。

Set dbeng = CreateObject("DAO.DBEngine.120") 
strMdbFile = "C:\database53.accDB" 
Set db = dbeng.OpenDatabase(strMdbFile) 

strSql = "ALTER TABLE FAXBOOK add column ID COUNTER primary key" 
db.Execute strSql 

はその後、Windowsのコマンドラインから、あなたが行く:

C:\>c:\windows\syswow64\wscript.exe "c:\addpk.vbs" 

あなたは、私が32ビットアクセスを想定しておりますので、ここで32ビット版を使用しています。

あなたが使用して、事前アクセス2010を使用している場合:私は、上記にVBSスクリプトに組み込まれたウィンドウを使用していますが、あなたは上記の代わりにjavascritingを使用することができます

Set dbeng = CreateObject("DAO.DBEngine.36") 
strMdbFile = "C:\database53.mdb" 
Set db = dbeng.OpenDatabase(strMdbFile) 
etc. 

(すぐ上のファイルを保存します.jsとして)。

mdbファイルを使用している場合は、ソフトウェアがインストールされていないWindowsのボックスでも上記の動作が可能です。言い換えれば、クリーンなWindows XPボックスは、上記のWindowsスクリプトをAccessをインストールする必要なく実行します。

上記のように、JETの例では? JETはWindows 98SE以降のデフォルトでWindowsにインストールされているので、上記のmdbスクリプトはこれらのボックスでも動作します。 (クリーンなバージンインストールでも上記のスクリプトが実行されます)。

また、accDBファイルを使用している場合は、ACEデータエンジンが必要です。これはWindowsではデフォルトではインストールされません。インストールする必要があります。または、Accessがインストールされていることを期待できます。あなたが望むなら、エンジンはAccessから別々のダウンロードとしてインストールすることができます。 64ビットバージョンもあります。

この日の終わりには、Accessは必要なく、ベースウィンドウのスクリプトを使用してそれらのデータベースを更新することができます。

+1

しかし、すでにデータが入っているテーブルにidカラムが追加されると、既存のリレーションシップではほとんど役に立たない数字が入力されますが、空のテーブルにデータセット全体を追加すると、自動インクリメント列に既存の一意の数値IDを追加します。 – Fionnuala

関連する問題