2009-05-01 26 views
1

私はMS Accessを使用するデータベースプログラムを持っています。時間が来て、私はそれをクライアント/サーバーアプリにする必要があります。スキームの背後にあるアイデアは次のとおりです。サーバーはデータベースを保持し、1つまたは複数のクライアントが同時にアクセスする必要があります。プログラムはまだMsアクセスの下で動作する必要があります(DBの移植とアプリケーションの書き換えは問題になりません)。Delphi - ネットワークODBCデータベース(MS Access)

正直言って私が本当に気に入らない別の計画は、クライアントがサーバーからDBファイルを要求し、LAN経由で転送し、ローカルにアクセスすることです...しかし、クライアントはそれを変更することができます効果がありません。

私の質問は次のとおりです。これを実装する適切な方法はどれですか。そしてネットワーク化されたデータベースにアクセスする方法は?それを共有するか、Indyなどを使用する方法があります。

+1

私はすべての答えを読んだが、まだあなたの質問を理解していません。答えの中には、Accessをフロントエンドとして使用していると仮定しているものがあります。これにより、Delphiが何をしているのかという疑問が生じます。私はあなたがJet MDBを使用していることを意味していると思います。アクセスはどのレベルにも関与していません。また、「プログラムはまだMsアクセスの下で動作する必要があります(DBの移植とアプリケーションの書き換えは問題ありません) "サーバーのバックエンドを使用する新しいアプリケーションを開発しているときにJetプロダクションバックエンドを使用する必要があるということです。しかし、あなたのシナリオが何であるかは私にはっきりと分かりません。 –

+0

Delphiアプリケーションはデータベースを操作します。 Delphiの標準ADOコンポーネントを使用して、MDBデータベースにアクセスします。今はデータベースがローカルに保存されるまでです。アプリケーションは別のPCに置く必要がありますが、DBを操作するために使用されますが、他のクライアントも接続してデータベースを変更する必要があります。 質問は「これを行う正しい方法は何ですか」でした。 書き換え部分は、ADOと互換性のないDBシステムに移植することは有効な解決策ではないことを意味します。 – zz1433

答えて

1

がアクセスデータベースを共有するには、単にネットワークに* .MDBファイルを配置します。 私は火の鳥へのアクセスからの移行は非常に簡単に

ツール、私が使用して(私はFirebirdのは、デルファイのためのMySQLよりもbetterだと思います)それをネットワーク上で共有して開くことができます。私は最大15人のネットワークユーザーにこのテクニックを使用しています。それ以上のトラフィックがある場合は、SQL Serverにプッシュします。

SQLServerへの移行は非常に簡単です。特にdbGOコンポーネント(ADO)をすべて使用する必要がある場合は、SQL Serverインスタンスを指すように接続文字列を変更する必要があります。このような変換で唯一問題となったのは、ブール値のフィールドであった。アクセスでは、これらのフィールドは0または-1の内部表現を持ち、SQL Serverでは0または1の内部表現を持ちます。アクセスでは、SQL Serverではブール値として解決されます。たとえば、次のクエリは、SQL Serverに失敗します。

SELECT * FROM TABLE WHERE BOOLFIELD 

それはのように書き換えることがあります。私の他のクエリのすべてがどの、日付/時間を除いて...正しく動作

SELECT * FROM TABLE WHERE BOOLFIELD <> 0 

私はパラメータとして渡し、ドライバが翻訳を処理させることをお勧めします。

変換プロセスはかなり簡単です。移行ツールを使用してアクセスデータベースをSQL Serverに移行し、SQL Serverスクリプトデータベースを使用してスクリプトを生成します。このスクリプトを顧客に配布するか、各場所で自分で実行するか、ファイルから読み込んで各コマンドを解析して実行するプログラムを作成します。

OpenDataSourceメソッドを使用して1つのデータベースから別のデータベースにデータを移行し、次にアクセスデータベースから挿入を実行できます。

INSERT INTO TABLE FROM 
    OpenDataSource('Microsoft.Jet.OLEDB.4.0','Access.mdb')...TABLE 

別のオプションは、n-Tierに行くことです。 Delphiのエンタープライズ版をお持ちの場合、TClientDatasetsを使用してシステムを真のn-Tierソリューションに移行し、いくつかのサーバー機能を作成するのは難しくありません。もちろん、走行距離はアプリケーションの現在のレイアウトやシステムの複雑さに大きく依存します。

+0

答えをありがとう、私はネットワーク版を試してみます。 クライアントはサーバに多くのトラフィックを与えないので、テーブルに行を挿入し、いくつかの既存の行ともちろん3つのテーブルのクエリの内容を変更します。ケースの99%は150行を超えません。これが失敗した場合は、MSSQLを強く検討します。 – zz1433

+0

また、Accessで考慮するクライアントの制限があります。実際にデータベースに接続できるのは255個だけですが、20人以上のユーザーにAccessを使用するように私の顧客に勧めないのですが、それは私のアプリケーションです...あなたはもっと離れていくことができるかもしれません。 – skamradt

+0

通常、1つの接続されたクライアント、まれに2または3があります。だから私は255の接続がOKだと思います。しかし、私はすでにMS SQLを使って将来的に可能なアップグレードをしています。 – zz1433

0

なぜDBを移植するには、アプリケーションを書き直す必要がありますか?

SQL Server Migration Assistantを使用してMS AccessデータベースをSQL Serverに移行する方法はありますか?

1

Accessのようなファイルベースのデータベースは、本質的にシングルユーザーです。あなたはそれらを共有することができますが、あなたは壊れたデータベースと痛みの世界に自分自身を広げています。マルチユーザーアプリケーションを使用する場合は、マルチユーザーのサーバーベースのデータベースが必要です。

+0

完全に間違っています。アクセスデータベースは本質的にマルチユーザーであり、Jetの基礎に組み込まれています。アプリケーションとデータの部分を適切に配布するために何をしているのか分かっているなら、小さなワークグループのユーザー数(25人のユーザー)にとって非常に安全で信頼性が高く、アプリケーションをうまく書くと最大100ユーザー。 –

+0

自分が何をしているのか、まったくSQL初心者ではないことを知っている人として、私が働いていたAccessアプリケーションは10人の同時ユーザーの後で不安定になり、20人の同時ユーザーの後では使用できなくなります。一度に接続するユーザーの数が非常に少ないか、より良いデータベースシステムを指すマップされたテーブルを使用することが保証されない限り、Accessデータベースを100人のユーザーに提供する合理的な方法はありません。 – Juliet

+1

@ David-W-Fenton:このようなアクセスファンではないようにしてください。それはその場所を持っていますが、ユーザーの数がそれ以上では信頼できません。 SQL Serverのフロントエンドとして、便利です。これはファイル形式であり、「クエリを送信して結果を得る」という意味のエンジンではありません。データはローカルにコピーされ、ロックはネットワーク上に留まります。クライアントPCからプラグを抜くと、ネットワークコピーが破損する可能性があります。確実にバックアップすることはできません。 – gbn

1

デルファイのODBCコントロールでデータベースを使用している場合は、APとDBの移植について心配する必要はありません(修正するには多少のマイナーな問題かもしれません)。 ODBCはすべてのDBを同じインタフェースを使用するようにしているため、acc/pwを使用してログインするリモートサーバーにデータソース名(DSN)接続文字列を変更するだけで、すべてが動作するはずです。また、MySQLのような他のODBCシステムへのアクセスをわずかなSQLコマンド変更だけで変更しても、正常に動作する可能性があります。

質問に戻る。あなたのユーザーが2よりも大きくなった場合、サーバー上のファイルを使用するのは確実に失敗します。複数のユーザーが同時にデータベースにアクセスする場合は、DB側でトランザクションに不足しているトランザクション(またはアトミック)動作が必要になります。 MySQLやMSSQL、Oracle/DB2 /などの実際のDBサーバーだけがそれを行うことができます。

単一のデータベースファイルを共有しないでください。クライアントが1つしかない場合は、実際のデータベースサーバーを使用してください。

0

解決方法:RemObjects SDKのようなものを使用して、アプリケーションがデータベースからデータを取得するために呼び出すインターフェイスを定義します。あなたはおそらくデータモジュールや、必要な呼び出しを既に定義しているものがあるかもしれませんが、それはあなたのアプリを整理するのに役立ちます。その後、アプリケーションを使用してデータにリモートアクセスし、Accessデータベースにアクセスすることができます。それが適切であれば、データを別のものに移行することができます。クライアントを変更する必要はありません。現在はインタフェースを使用しているため、実装については気にしません。

彼らはまた、リモートデータアクセスシステムを実行しますが、私のニーズに合わないので、それを避けています。しかし、見る価値があるかもしれません。

0

ユーザーがインターネット上で広く配布されており、ファイル共有を使用したくない場合は、EQL Dataを使用してデータベースの複数のコピーを同期させておくこともできます。また、Web上にテーブルを公開するのにも役立ちます。

0

私はMSSQL Serverをチェックしていましたが、2005年と2008年の両方で.NET Frameworkが動作する必要がありました。 ADOと互換性のある他のデータベースシステム(ファイルベースのデータベースではない)

関連する問題