5

私は現在、24時間年中無休で実行され、OPCサーバーから常に情報を収集するアプリケーションを作成中です。

ここで行う必要があるのは、この情報をデータベース(.accdb-file)に送信することです。これは非常に迅速に行う必要があります。サーバーからミリ秒ごとに新しい値をフェッチし、その値を同じ速度でデータベースに送信する必要があります。最後に、毎日00:00にデータベースを.zipファイルに圧縮しています。

私はマニアックなようにウェブを検索してきましたが、「最新の」チュートリアルが見つからないようです。これまでに見つけたものはすべて、プロバイダーとして「Microsoft.Jet.OLEDB.4.0」を使用していますが、Windows7PCには存在しません。

接続をテストするための小さなアプリケーションを作成しました。現在のコードを以下に添付して、これまでに試したことのヒントを示しますが、いずれも機能しないようです。

private void button1_Click(object sender, EventArgs e)
{
    System.Reflection.Assembly oAssembly = System.Reflection.Assembly.GetExecutingAssembly();
    System.IO.Stream oStream = oAssembly.GetManifestResourceStream("RSLogixDB.accdb");
    System.IO.FileStream fileStream = new System.IO.FileStream("C:\\Users\\sezettersth\\Documents\\RSLogixDB.accdb", System.IO.FileMode.Create);

    byte[] abyt = new byte[oStream.Length];
    oStream.Read(abyt, 0, (int)oStream.Length);
    fileStream.Write(abyt, 0, (int)oStream.Length);
    fileStream.Close();
    if (fileStream != null)
    {
        fileStream.Close();
        fileStream = null;
    }
    if (oStream != null)
    {
        oStream = null;
    }
}

これは私が試した最初のアプローチです。ここでは、ファイルの作成と書き込みに使用される自家製のクラスを使用します。残念ながら、.accdbファイルでは機能しませんでした。(最初の行のコメントには、私が試したプロバイダーが含まれています。

private void button1_Click(object sender, EventArgs e)
{
    //sFileDia.ShowDialog();
    //Provider=Microsoft.ACE.OLEDB.12.0
    //Povider=.NET Framework Data Provider for OLE DB
    //Povider=Microsoft.Jet.OLEDB.4.0
    //Driver={Microsoft Access Driver (*.mdb, *.accdb)};
    //Data Source=C:\\Users\\sezettersth\\Documents\\RSLogixDB.accdb;
    //Persist Security Info=False;
    //Provider=Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\sezettersth\\Documents\\RSLogixDB.accdb;Persist Security Info=False
    string RSLogixDB = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\sezettersth\\Documents\\RSLogixDB.accdb;Persist Security Info=False";
    string RSLogixDBPath = "C:\\Users\\sezettersth\\Documents\\RSLogixDB.accdb";
    OleDbConnection connection = new OleDbConnection(RSLogixDB);
    string connectionStr = connection.ConnectionString;

    //OleDbDataReader dataReader = new OleDbDataReader(RSLogixDB);
    ImportExport textwriter = new ImportExport();
    textwriter.setExportPath(RSLogixDBPath);
    textwriter.endExport();
}

これには簡単な解決策が必要です。「Microsoft.Jet.OLEDB.4.0」プロバイダーなしでAccessを使用しているのは私だけではありません。

(私はファイルを圧縮するためのコードを開始していません。その方法についてアイデアがあれば、喜んで聞いていますが、ここでの主な焦点はデータベースの問題です。)

更新:最初のようにプロバイダーに問題がない可能性がありますが、Microsoft.ACE.OLEDB.12.0では.accdbファイルを作成できますが、基本的には空のtxtファイルであり、拡張子が大きく、開くことができません。またはMSAccessで使用されます。動作する.accdbファイルを作成するにはどうすればよいですか?

4

4 に答える 4

11

あなたのコードについて

正直なところ、私はあなたが提示したコードサンプルであなたが達成しようとしていることを途方に暮れています。
私が見ることができることから、あなたは単にファイルを作成しているだけですRSLogixDB.accdb
何かが足りないかもしれませんが、それはデータベースを作成する方法ではありません。

これらのSOの質問に対する回答のコードを調べて試しましたか?

さて、もう少し説明します。

ジェットvsACE

まず、ACCDBファイル形式は、現在ACEと呼ばれているJetの完全な改良の結果です。これはAccess2007/2010でのみ使用され、下位互換性のない新しい機能が含まれています。

このようなファイルを開くには、Access 2007/2010(または少なくとも無料のAccess Runtime )がインストールされているか、Microsoftの特定のACEドライバーがインストールされている必要があります。

32/64ビットネスについて

正気を保つために、OSのビット数に関係なく、OfficeとAccessの32ビットのみを使用してください。Excelを限界まで押し上げている場合を除いて、Microsoftでさえ64ビットバージョンの使用を推奨していません。

  • Office32ビットと64ビットのアプリケーションを混在させることはできません
  • 32ビットと64ビットのACEドライバーを同じマシンにインストールすることはできません
  • ACEドライバーのバージョン2007または2010のいずれかを使用しますが、両方をインストールしないでください。
  • .NetアプリケーションがインストールされているAccess/ACEドライバーと同じビット数でコンパイルされていることを確認してください(したがって、AnyCPUではなく、上記のアドバイスに従う場合は、特にx86にコンパイルする必要があります)。

パフォーマンス

いくつかのルールを守れば、Accessデータベースで非常に適切なパフォーマンスを得ることができます。

  • 可能であれば、データベースに書き込むアプリケーションと同じマシンにデータベースを保持します(ネットワークの速度低下を回避します)

  • アプリケーションがデータベースを使用している唯一のアプリケーションである場合は、共有モードではなく排他モードでデータベースを開きます。

    // Share Mode=16 - use if multiple users must have simultaneous access to the db
    string constr = @"Provider=Microsoft.ACE.OLEDB.12.0;Mode=16;Data Source=C:\...\RSLogixDB.accdb;user id=;password=;";
    
    // Share Mode=12 - exclusive mode if only your app needs access to the db
    string constr = @"Provider=Microsoft.ACE.OLEDB.12.0;Mode=12;Data Source=C:\...\RSLogixDB.accdb;user id=;password=;";
    
  • アプリケーションの起動時にデータベースへのダミー接続を開き、データベースが不要になるまで(たとえば、zipするため、またはアプリがシャットダウンするとき)、データベースを開いたままにします。これは実際には非常に重要なパフォーマンスの向上です。ドライバーがロックファイル
    を作成/破棄/更新する必要があるため、Accessデータベースへの新しい接続を開くにはコストがかかります。 データベースへの常時接続を維持すると、データベースへの読み取り/書き込みが大幅に高速化されます。このテーマの詳細については、次の記事を確認してください:OLE DB接続プールはどこにありますか?.accdl

タスクに戻る

あなたが達成しようとしていることを私がする方法:

  • Accessを使用しRSLogixDB.accdbて、データを保持するテーブルを使用して単純なデータベースを手動で作成します。また、データがほとんどまたはまったくないテーブルを
    作成します。dummyこれを使用して、接続を開いたままにし、ロックファイルのパフォーマンスの問題を回避します。

  • データベースを毎日最初から再作成する必要がある場合は、元のデータベースのコピーをテンプレートとして保持し、そのテンプレートをコピーして、そのコピーに新しい日次データを入力します。

  • dbの唯一のユーザーである場合は、排他モードで開きます。

  • 接続を開き、ダミーテーブルからデータを読み取りますが、閉じないでください。開いたままにします。

  • 一日中データテーブルにデータを保存します

  • 深夜にデータベースを閉じ(ダミーテーブルを閉じます)、ロックファイル.accdlが消えたことを確認してから、データベースをzip形式で圧縮します。
    空のデータベースから開始する必要がある場合は、データベースをテンプレートに置き換えます。
    また、データベースを圧縮して圧縮してからサイズを縮小します。

  • ADO.Netデータアクセスの標準パフォーマンスがケースに対して不十分な場合は、ネイティブDAOルーチンの使用を確認してください。このSOの質問に対する回答を確認してください:
    .NET / C#でAccessに多数のレコード(一括挿入)を書き込む

于 2012-05-02T10:02:30.807 に答える
1

私はあなたのためにこれを見つけました。 MS Access への接続 (Windows 7)

また、このフォーラム スレッドが役立ちます。

ありがとう

ポール。

于 2012-05-02T08:31:55.470 に答える