0

作業中のデータ入力Windows8アプリにSQLiteを使用しています。データベースの作成、データの挿入、列数の取得、およびデータの読み取りはできますが、列名を取得できません。

基礎となるフレームワークは、この投稿からのものです。

コマンドについて読みましたPRAGMA table_info(table_name);が、このクエリを正しく送信および読み戻すことができないようです。私は3日間グーグルしています!

MainPage.xaml.cs:

using SQLite;
using SqlLiteTest.Model;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using Windows.Storage;
using Windows.UI.Popups;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace SqlLiteTest
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
            txtPath.Text = ApplicationData.Current.LocalFolder.Path;
        }

        private async void createDB(object sender, RoutedEventArgs e)
        {
            // access local folder
            var qvLocalFolder = Windows.Storage.ApplicationData.Current.LocalFolder;

            try
            {
                //Create a blank carrier file
                StorageFile qvLocalFileCarrier = await qvLocalFolder.CreateFileAsync("qvdbLocal.db", CreationCollisionOption.FailIfExists);

                //Write the blank carrier file
                await FileIO.WriteTextAsync(qvLocalFileCarrier, "");
            }
            catch { }

            // connect
            var path = Windows.Storage.ApplicationData.Current.LocalFolder.Path + @"\qvdbLocal.db";
            var db = new SQLiteAsyncConnection(path);

            // create table
            await db.CreateTableAsync<qvdb>();

            // insert data
            var insertRecords = new List<qvdb>()
            {
                new qvdb
                {
                            qvdbRecord = 1,
                            qvdbNotes = "Notes1",
                            qvdb001 = "Variable 1.1",
                            qvdb002  = "Variable 2.1"
                    },
                    new qvdb
                    {
                            qvdbRecord = 1,
                            qvdbNotes = "Notes1",
                            qvdb001 = "Variable 1.1",
                            qvdb002  = "Variable 2.1"
                    },
                    new qvdb
                    {
                            qvdbRecord = 1,
                            qvdbNotes = "Notes1",
                            qvdb001 = "Variable 1.1",
                            qvdb002  = "Variable 2.1"
                    },
            };

            await db.InsertAllAsync(insertRecords);

            // read count
            var allUsers = await db.QueryAsync<qvdb>("SELECT * FROM qvdb");
            var count = allUsers.Any() ? allUsers.Count : 0;

            Debug.WriteLine(count);
        }

        private async void updateDB(object sender, RoutedEventArgs e)
        {
            var path = Windows.Storage.ApplicationData.Current.LocalFolder.Path + @"\qvdbLocal.db";
            var db = new SQLiteAsyncConnection(path);

            var tempCell = db.QueryAsync<qvdb>("UPDATE qvdb SET qvdbNotes ='!@#$%$%^^&*()+)(*&^%$#@!{:L<>?' WHERE qvdbRecord = 10");
            await db.UpdateAsync(tempCell);
        }

        private async void readDB(object sender, RoutedEventArgs e)
        {
            var path = Windows.Storage.ApplicationData.Current.LocalFolder.Path + @"\qvdbLocal.db";
            var db = new SQLiteAsyncConnection(path);

            var query = db.Table<qvdb>();
            var result = await query.ToListAsync();
            foreach (var item in result)
            {
                MessageDialog dialog = new MessageDialog(string.Format("{0} {1} {2}", item.qvdbRecord, item.qvdbNotes, item.qvdb001));
                await dialog.ShowAsync();
            }
        }

        private void readColNames(object sender, RoutedEventArgs e)
        {
        }
    }
}

qvdb.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SQLite;

namespace SqlLiteTest.Model
{
    public class qvdb
    {
        [PrimaryKey, AutoIncrement]
        public int qvdbRecord { get; set; }

        [MaxLength(3000)]
        public string qvdbNotes { get; set; }

        [MaxLength(1000)]
        public string qvdb001 { get; set; }

        [MaxLength(1000)]
        public string qvdb002 { get; set; }

    }
}

情報をありがとうCL。クラスを追加しましたが、アクセス方法がわかりません。もう少しコード...

    // this works
    // read record count
    var allRecords = await db.QueryAsync<qvdb>("SELECT * FROM qvdb");
    var countRecords = allRecords.Any() ? allRecords.Count : 0;
    this.textboxLog.Text = this.textboxLog.Text + Environment.NewLine + "There are " + countRecords + " records.";

    // ??
    // read column names
    var allColumns = await db.QueryAsync<qvdb>("PRAGMA table_info(qvdb)");
    foreach (var item in allColumns) {
       //read name
        this.textboxLog.Text = this.textboxLog.Text + Environment.NewLine + "columbn names";
    }
4

2 に答える 2

5

によって返されるレコードは次のPRAGMA table_infoようになります。

public class table_info_record
{
    public int    cid        { get; set; }
    public string name       { get; set; }
    public string type       { get; set; }
    public int    notnull    { get; set; }
    public string dflt_value { get; set; }
    public int    pk         { get; set; }
}

次のように使用します。

db.QueryAsync<table_info_record>("PRAGMA table_info(...)");
于 2012-11-10T11:23:26.847 に答える
0

o CLのアドバイスでループを終了すると、このコードは列名を正常に読み取ります。

 // read column names
           var query = await db.QueryAsync<table_info_record>("PRAGMA table_info(MY_TABLE_NAME_HERE)");

            foreach (var item in query)
            {
                Debug.WriteLine(string.Format("{0}", item.name) + " is a column.");
            }
于 2012-11-12T18:00:16.600 に答える