我有我想我已經用C#編寫的軟件來替代,使用folllowing技術這個基礎號角TPS商業軟件:顯示大量的來自WCF記錄在一個DataGridView與定位
- SQL基於消息的Server 2008 R2的快速
- 的EntityFramework 4
- WCF服務具有的wsHttpBinding和使用安全UserNamePassword憑據
- Windows窗體客戶
Clarion軟件使用TPS文件作爲數據庫表。 TPS數據庫文件使用ISAM文件格式,允許將所有索引和多個數據文件包含在一個磁盤文件中。這種方法的優點是記錄訪問速度非常快,但主要缺點是多個客戶端訪問時數據庫損壞的可能性很高,並且表中數據不一致的可能性很高。
我想替換它,因爲我想更好地控制我的數據庫訪問(例如誰可以訪問什麼),我不希望允許客戶端直接訪問數據庫和其他東西,我發現WCF服務完美的任務。
這在理論上都很好,但真正的使用場景使我從現在開始實施它。例如,當我打開一個需要顯示相對較大的記錄列表(大約20,000)的Datagridview對話框時,需要大約10秒鐘才能顯示。在號角,它立即發生。 Clarion中有一項名爲「定位器」的功能,它允許您通過鍵入記錄屬性(例如名稱)開頭的那些字母來定位記錄。
我知道通過WCF對數據進行序列化和反序列化需要一些時間。至於序列化,我優化了代碼,WCF服務使用DataContractSerializer(具有循環引用意識行爲)。我已經使用EF POCO實體生成器將EF生成的默認實體更改爲POCO實體。我已經添加了預編譯視圖,我的WCF服務正在返回名爲「ViewModels」的對象,而不是我認爲需要的POCO。
我創建的東西,是類似於號角的「定位器」的行爲,它看起來像這樣:
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將如此多記錄的快速數據加載到datagridview中?
應該是一個評論 – Reda