2013-01-04 39 views
0

我有我想我已經用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中?

回答

-1

看起來您正在循環播放所有記錄,但Clarion代碼從文件索引獲取新位置。

+0

應該是一個評論 – Reda

0

當多個程序訪問它們時Clarion TPS文件不會損壞,因爲它們使用文件鎖定協議。如果通過使用機會鎖定(oplocks)的共享文件訪問它們,則可能會搞亂,因爲鎖定/解鎖的順序可能會偏斜,或者如果您有任何運行Microsoft Security Essentials的客戶端(它具有「功能」混合鎖定/解鎖的順序,不,它不會被固定),但否則它的工作「很好」。

你的代碼速度慢的原因是因爲它必須通過文件中的所有行進行傳播,而且這是緩慢的,因爲它是所有磁盤I/O並且Clarion不執行任何緩存。

要訪問數據,您可以: 1)使用this tool將您的TPS文件轉換爲CVS並將它們導入到您的SQL數據庫中。這已被預先回答here

2)從SoftVelocity購買TPS-ODBC驅動程序並通過SQL查詢訪問TPS文件。 TPS驅動程序有一些怪癖,你需要一個函數來轉換日期和時間,你不能訪問大的模糊,一些查詢可能會返回比TPS文件包含的行少(取決於你的主鍵的構造),你必須在所有文件中都有一個唯一的主鍵。這與直接訪問文件一樣快/慢,因此我建議只使用此方法將數據導出到MSSQL數據庫。

還有幾種工具可以通過將DCT導出到文本文件(dtcx)將Clarion DCT轉換爲SQL,並且還可以通過將表類型從TPS更改爲MSSQL來使Clarion生成結構。

+0

謝謝你的回答和你有用的鏈接。訪問TPS數據不是問題。我能夠使用TopScan應用程序從Clarion TPS導出數據,甚至可以直接使用與Clarion 5捆綁在一起的一些TPS ODBC驅動程序從C#訪問該數據。使WinForms中的用戶體驗與Clarion類似,這是一個問題。 –

相關問題