2013-01-16 45 views
0

我想從SQLITE表列中讀取唯一值並將其顯示在列表框中。sqlite「select distinct」windows 8 app c#

這個SQL當我運行使用一個SQLite瀏覽器我的應用程序之外的語句,但我似乎無法得到內的結果到一個列表(或個別項目)語句

SELECT DISTINCT [COLUMN NAME] 
FROM [TABLE NAME] 

返回正確的結果我的應用程序添加到列表框。

我在我的c#/ XAML應用程序中有最新的SQLITE3包,它工作得很好。

這裏是我有工作,但是這似乎是一個低效的過程:

我有一個「qvdb」類來定義字符串值...

public class qvdb 
    { 
     [PrimaryKey, AutoIncrement] 
     public int qRecord { get; set; } 

     [MaxLength(3000)] 
     public string qCol_1 { get; set; } 
     [MaxLength(3000)] 
     public string qCol_2 { get; set; } 
     [MaxLength(3000)] 
     public string qCol_3 { get; set; } 
     [MaxLength(3000)] 
     public string qCol_4 { get; set; } 
     [MaxLength(3000)] 
     public string qCol_5 { get; set; } 
     [MaxLength(3000)] 
     public string qCol_6 { get; set; } 
     [MaxLength(3000)] 
     public string qCol_7 { get; set; } 
     [MaxLength(3000)] 
     public string qCol_8 { get; set; } 
     [MaxLength(3000)] 
     public string qCol_9 { get; set; } 
     [MaxLength(3000)] 
     public string qCol_10 { get; set; } 
} 

...的應用範圍列表保持琴絃......

public static List<String> qCols = new List<String>(); 

...並把它們放在一個列表中的過程...

public static async Task mProcessColumns(IEnumerable<qvdb> input) 
     { 
      var dbExists = await qFunctions.fnFileExistsAsync(ApplicationData.Current.LocalFolder, qgv.fileDBLocal); 
      if (!dbExists) return; 

      try 
      { 
       qCols.Clear(); 
       foreach (var item in input) 
       { 
        qCols.Add(item.qCol_1); 
        qCols.Add(item.qCol_2); 
        qCols.Add(item.qCol_3); 
        qCols.Add(item.qCol_4); 
        qCols.Add(item.qCol_5); 
        qCols.Add(item.qCol_6); 
        qCols.Add(item.qCol_7); 
        qCols.Add(item.qCol_8); 
        qCols.Add(item.qCol_9); 
        qCols.Add(item.qCol_10); 
} 

...並使用上述填寫列表框的方式笨重「通過每個記錄步」:

private async Task mLoadListboxes(int varZeroRow, int deZeroCol) 
     { 
      //Debug.WriteLine("mLoadListboxes"); 

      try 
      { 
       // add a list 
       var tempList = new List<string>(); 

       // check for no records ... no records means nothing to load 
       if (lbRecord.Items == null) return; 

       // add unique items to a list 
       for (iRecord = 0; iRecord <= lbRecord.Items.Count - 1; iRecord++) 
       { 
        var fillLBs = await qgv.db.QueryAsync<qvdb>("SELECT * FROM qvdb WHERE qRecord=" + 
                   Convert.ToInt32(lbRecord.Items[iRecord].ToString()) + 
                   ";"); 
        await qProcessColumns.mProcessColumns(fillLBs); 


        if (qProcessColumns.qCols[varZeroRow] == null) continue; 
        var tempTextToDedup = qProcessColumns.qCols[varZeroRow]; 
        if (tempTextToDedup == null) continue; 
        if (tempList.Contains(tempTextToDedup)) continue; 
        if (tempTextToDedup != " " && tempTextToDedup != "") 
        { 
         // add to list 
         tempList.Add(tempTextToDedup); 
        } 
       } 


       // sort list 
       tempList.Sort(); 

       // set lb items to list 
       qgv.deListboxes[deZeroCol].ItemsSource = tempList; 

       Task.WaitAll(); 
      } 
      catch (Exception) 
      { 
       qgv.failed = true; 
      } 
     } 

的「SELECT DISTINCT」似乎跳過了很多步驟和返回,可以是一個列表排序並使用.ItemsSource添加到列表框。


感謝您的指導CL。所以,下面這個建議我創建完全按照你的建議類:

public class JustOneColumn 
    { 
     public string value { get; set; } 
    } 

我第一次嘗試直接設置列表框中查詢變量的ItemsSource屬性,並得到這個錯誤:

error

然後我試圖創建處理結果的方法:

public static List<String> qDistinctColElements = new List<String>(); 



public static void mProcessDistinctColElements(IEnumerable<JustOneColumn> input) 
     { 
      try 
      { 
       qDistinctColElements.Clear(); 
       foreach (var item in input) 
       { 
        qDistinctColElements.Add(item.value); 
       } 
      } 
      catch (Exception) { failedProcessColumns = true; } 

     } 

當我嘗試調用此方法...

var colContents = qgv.db.QueryAsync<JustOneColumn>("SELECT DISTINCT qCol_" + (_v + 1) + " FROM qvdb;"); 
qProcessColumns.mProcessDistinctColElements(colContents); 
qgv.deListboxes[_v].ItemsSource = colContents; 

...我得到下一個colContents波浪線說:「錯誤2參數1:不能轉換從 'System.Threading.Tasks.Task System.Collections.Generic.List QuantiView.JustOneColumn' 到「系統。 Collections.Generic.IEnumerable QuantiView.JustOneColumn''

我驗證了SQL查詢在SQLite數據庫瀏覽器中的工作,並使用Debug.Writeline查看各種輸出,並看到沒有返回的值。

+1

請添加一些代碼來說明您的問題。 – kfuglsang

回答

1

您的類qvdb對應於由SELECT * FROM qvdb查詢返回的表。

對於由SELECT DISTINCT ...查詢返回的表,你也應該建立相應的類:

public class JustOneColumn 
{ 
    public string value { get; set; } 
} 

... qgv.db.QueryAsync<JustOneColumn>("SELECT DISTINCT MyCol FROM ..."); 
+0

非常感謝...添加到原來的帖子,我仍然明顯缺少一些東西。 – Gary95054

+0

你忘了'await'。 –

+0

謝謝......我實際上刪除了使異步狀態不再相關的文件檢查,因此該方法現在是一個常規的void,因此沒有await關鍵字。 – Gary95054

0

我有同樣的問題。我已經嘗試過使用此處顯示的JustOneColumn表的解決方案。它沒有工作,直到我添加as value別名到我的sql語句,即

String sql = "SELECT DISTINCT col AS value FROM myTable" 

IEnumerable<OneIntColumn> result = db.Query<OneIntColumn>(sql) 

注意,在我的情況OneIntColumn.valueint類型。如果SQL語句中沒有正確的列別名,查詢總是返回0。