0

この Clarion TPS ベースのビジネス ソフトウェアを、次のテクノロジを使用して C# で記述したソフトウェアに置き換えたいと考えています。

  • SQL Server 2008 R2 Express
  • エンティティフレームワーク 4
  • wsHttpBinding と UserNamePassword 資格情報を使用したメッセージ ベースのセキュリティを備えた WCF サービス
  • Windows フォーム クライアント

Clarionソフトウェアは、TPS ファイルをデータベース テーブルとして使用します。TPS データベース ファイルはISAMファイル形式を使用して、すべてのインデックスと複数のデータ ファイルを 1 つのディスク ファイルに含めることができます。このアプローチの利点は、レコードへのアクセスが非常に高速であることですが、主な欠点は、複数のクライアントがアクセスしたときにデータベースが破損する可能性が高く、テーブルに矛盾したデータが含まれる可能性が高いことです。

データベース アクセスをより適切に制御したい (たとえば、誰が何にアクセスできるか)、クライアントがデータベースに直接アクセスすることを許可したくないので、それを置き換えたいと考えています。タスク。

これは理論的にはすべて問題ありませんが、実際の使用シナリオでは、今のところ実装を思いとどまらせました。たとえば、比較的大きなレコードのリスト (約 20.000) を表示する必要がある Datagridview でダイアログを開くと、表示に約 10 秒かかります。Clarion では、それが瞬時に行われます。Clarion には「ロケーター」と呼ばれる機能があり、レコードのプロパティ (名前など) で始まる文字を入力することで、レコードを見つけることができます。

WCF を介したデータのシリアル化と逆シリアル化には時間がかかることを認識しています。シリアライゼーションに関しては、WCF サービスがDataContractSerializerを使用するようにコードを最適化しました(Cyclic 参照を認識する動作を使用)。EF POCO エンティティ ジェネレーターを使用して、EF によって生成された既定のエンティティを POCO エンティティに変更しました。プリコンパイルされたビューを追加しました。私の WCF サービスは、必要だと思っていた POCO ではなく、"ViewModel" と呼ばれるオブジェクトを返しています。

そのクラリオンの「ロケーター」動作に似たものを作成しました。次のようになります。

private void locator_TextChanged(System.Object sender, System.EventArgs e)
{
    if (!string.IsNullOrWhiteSpace(locator.Text))
    {
        for (int idx = 0; idx <= dataGrid1.RowCount - 1; idx++)
        {
            var row = dataGrid1.Rows[idx];
            if ((row.DataBoundItem != null) && ((SomeViewModel)row.DataBoundItem).Name.ToUpper().StartsWith(locator.Text.ToUpper()))
            {
                row.Cells[0].Selected = true;
                break;
            }
        }
    }
}

数百、数千のレコードでも問題なく動作します。しかし、多数のレコードがあると見た目も気分も悪くなります。コードを見たときに推測したかもしれません。この方法でも速くは動作しません:

if (!string.IsNullOrWhiteSpace(locator.Text)) {
    var r = dataGrid1.Rows.Cast<DataGridViewRow>().FirstOrDefault(x => ((SomeViewModel)(x.DataBoundItem)).PrezimeIme.ToUpper().StartsWith(locator.Text.ToUpper()));
    if (r != null) 
    {
        r.Cells[0].Selected = true;
    }
}

質問。上記のテクノロジーを使用していることがわかっている場合、データグリッドビューへの非常に多くのレコードのClarionの高速データロードを模倣するにはどうすればよいですか?

4

2 に答える 2

0

Clarion TPS ファイルは、ファイル ロック プロトコルを使用しているため、複数のプログラムがアクセスしても破損しません。ロック/ロック解除の順序が歪む可能性があるため、日和見ロック (oplocks) を使用する共有ファイルを介してアクセスしている場合、または Microsoft Security Essentials を実行しているクライアントがある場合 (「機能」がある場合)、これは混乱する可能性がありますロック/ロック解除の順序を混ぜてください。いいえ、修正されません)が、それ以外の場合は「うまく」機能します。

コードが遅い理由は、ファイル内のすべての行を反復処理する必要があるためです。これは、すべてディスク I/O であり、Clarion がキャッシュを行わないため、低速です。

データにアクセスするには: 1)このツールを使用して TPS ファイルを CVS に変換し、それらを SQL データベースにインポートします。これは以前にここで回答されています。

2) SoftVelocity から TPS-ODBC ドライバーを購入し、SQL クエリを介して TPS ファイルにアクセスします。TPS ドライバーにはいくつかの癖があり、日付と時刻を変換する関数が必要です。大きなディムにアクセスできません。クエリによっては、TPS ファイルに含まれる行よりも少ない行が返される場合があります (主キーの構成方法によって異なります)。すべてのファイルに一意の主キーがあります。これは、ファイルに直接アクセスするのと同じくらい高速/低速であるため、この方法のみを使用してデータを MSSQL データベースにエクスポートすることをお勧めします。

また、DCT をテキスト ファイル (dtcx) にエクスポートして Clarion DCT を SQL に変換できるツールもいくつかあります。また、テーブル タイプを TPS から MSSQL に変更して Clarion に構造を生成させることもできます。

于 2014-04-05T23:55:35.250 に答える
-1

すべてのレコードをループしているように見えますが、Clarion コードはファイル インデックスから新しい位置を取得します。

于 2013-11-21T18:30:27.707 に答える