0

我正在将 SQLite 用于我正在开发的数据输入 Windows 8 应用程序。我可以创建数据库、插入数据、检索列数和读取数据,但无法获取列名。

底层框架来自这篇文章

我阅读了有关该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 回答