0

SQLITE テーブルの列から一意の値を読み取り、リスト ボックスに表示しようとしています。

この SQL ステートメント

SELECT DISTINCT [COLUMN NAME]
FROM [TABLE NAME]

SQLITE ブラウザーを使用してアプリの外部でステートメントを実行すると正しい結果が返されますが、結果をアプリ内のリスト (または個々の項目) に取得してリストボックスに追加することができないようです。

私の 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' から 'System.Collections.Generic.IEnumerable QuantiView.ジャストワンカラム」

SQL クエリが SQLite Database Browser で機能することを確認し、Debug.Writeline を使用してさまざまな出力を調べたところ、戻り値がありませんでした。

4

2 に答える 2

1

クラスは、クエリqvdbによって返されるテーブルに対応します。SELECT * FROM qvdb

クエリによって返されるテーブルについてはSELECT DISTINCT ...、対応するクラスも作成する必要があります。

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

... qgv.db.QueryAsync<JustOneColumn>("SELECT DISTINCT MyCol FROM ...");
于 2013-01-17T09:16:12.857 に答える
0

私も同じ問題を抱えていました。JustOneColumnここに示す表を使用して解決策を試しました。as valueSQLステートメントにエイリアスを追加するまで機能しませんでした。

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

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

OneIntColumn.value私の場合はタイプであることに注意してくださいint。SQL ステートメントのクエリに適切な列エイリアスがないと、結果として常に 0 が返されました。

于 2014-01-20T23:06:30.123 に答える