2012-03-09 48 views
4

我的任務是編寫一個允許用戶運行臨時查詢的winforms c#應用程序。我在網上搜索並找到了很多可以購買的工具(EasyQuery),但是現在購買它是不可能的。編寫Winforms動態查詢工具

所以我想自己寫這個。此時,我創建了一個在運行時隨表格/列填充的樹視圖,並且我可以選擇用戶檢查的列。但現在我必須弄清楚如何動態地選擇他們已經選擇的表格。

部分表結構如下:

Table - Roles - PK = RoleId 
RoleId 
RoleName 

Table - Center PK = CenterId/RoleId/Prefix 
CenterId 
RoleId 
Prefix 

Table - Employee - PK = EmployeeID 
EmployeeId 
Name 
CenterId 
Dept 
Org 

Table - Prof - PK = EmployeeId/Profile 
EmployeeId 
Profile 

我有一個總能在各個領域中加入6張桌子,但由於用戶需要加入的飛行,我需要確定JOIN當他們想要生成SQL時。在這一點上,我不知道最好的方式來產生這些JOINs

我甚至想過在數據庫中創建一個表,其中列出了每個表/列的JOINs,然後我可以從那裏創建它,但我無所適從。

我自己也嘗試類似這樣的東西,但我不想開始就想錯了,如果有一個不同的方式建議:

private void GetJoins() 
{ 
    string joinList = string.Empty; 

    foreach (TreeNode tn in TablesTreeView.Nodes) 
    { 
     if (tn.Checked) 
      if (tn.Nodes.Count > 0) // this would be parent items only 
      { 
       foreach (TreeNode childNode in tn.Nodes) 
       { 
        // for first child checked 
        // check the next checked parent nodes for matching checked fields 
        // if next parent node has same field name checked then add the JOIN 
       } 
      } 
     } 
} 

這是否看起來是在正確的軌道上或者你可以提出另一種方式?

我知道這將是一個非常困難的任務,我甚至還沒有得到動態的WHERE條款。我只是尋找建議在最佳方式創建JOINs在臨時的基礎上。

+0

你的建造成本真的低於1350美元? – 2012-03-11 19:56:01

+0

目前,沒有預算購買外部產品。 – Taryn 2012-03-11 20:10:58

回答

1

我可以感謝您從頭開始編寫這本書的衝動,畢竟它充滿挑戰和樂趣!但是,不要因爲浪費寶貴的資源而寫錯了很多已經寫好的東西。創建一個功能強大且安全的查詢工具要比表面上看起來複雜得多。

SQL Server 2008 Management Studio Express上次免費檢查。

Versabanq Squel是一個強大且免費的SQL查詢工具。

There are many others

And even more here

+0

給他們訪問SQL服務器管理工​​作室或替代方案並不能解決我的問題。這將被不知道SQL的人使用。 – Taryn 2012-03-11 23:04:00

+0

如果你真的想自己寫,你可以下載這個作爲起點,並調整你想要的一切:http://www.codeproject.com/Articles/13419/SelectQueryBuilder-Building-complex-and-flexible-S – Coltech 2012-03-11 23:15:15

0

在我看來,根據您的樣本模式,最好的辦法是與所有的聯接預先創建視圖。

此外,似乎你讓他們根據特定的字段和參數搜索你的數據庫,而不是真的讓他們寫查詢,因爲他們本身並不是sql literate。它仍然不是一個簡單的任務(imho),但是一旦你有了這個視圖,你就可以向他們展示「可搜索的」字段以及他們可以選擇的「可顯示」字段(等待,直到你開始處理複雜的地方從句:)

+0

我看過創建一個視圖,所有表加入(有比上面顯示的更多),但問題是返回記錄的笛卡爾積,使得結果幾乎不可用。我知道,一旦我到達WHERE子句,我的樂趣就會真正開始。 – Taryn 2012-03-12 14:19:03

+0

@bluefeet,這取決於你如何加入你的表沒有?如果你讓用戶選擇他們希望在結果中看到的字段,它不應該給他們一個巨大的笛卡爾結果集,基本上,你會在* FROM *子句中使用一個視圖,並且你會生成* SELECT *和*地點*部分 – Jason 2012-03-12 14:26:26

-1

我認爲你是錯誤的方式。您的用戶必須能夠加入所有這些表格組合嗎?他們甚至知道什麼是加入?

這裏有一個簡單的形式給出:

  • 創建您的用戶將要執行查詢的數據庫。
  • 我假設你的查詢將帶參數。這些應該用佔位符標記爲 。
  • 您的界面將顯示用戶的所有可能查詢。 一旦用戶選擇了他們想要使用的查詢(當然基於 描述性名稱),界面將解析查詢參數佔位符併爲用戶輸入生成一個表單(即基於上述假設的 課程)您的查詢需要 參數)

在這一天結束時,你會用你自己可以控制的質量可重複使用的查詢功能強大的資料庫中結束。而不是讓用戶點擊來創建甚至無法重複使用的惡毒怪物!