この 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の高速データロードを模倣するにはどうすればよいですか?