我想從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屬性,並得到這個錯誤:
然後我試圖創建處理結果的方法:
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查看各種輸出,並看到沒有返回的值。
請添加一些代碼來說明您的問題。 – kfuglsang