SQLite PRAGMA table_info(table)在使用Data.SQLite进行C#编程时无法返回列名

4
我使用以下示例代码,并希望以某种方式获取sqlite3数据库的列名:
using System;
using System.Data.SQLite;
namespace Program
{
class Program
{
    static void Main(string[] args)
    {
        Program stuff = new Program();
        stuff.DoStuff();
        Console.Read();
    }
    private void DoStuff()
    {
        SQLiteConnection.CreateFile("Database.sqlite");
        SQLiteConnection con = new SQLiteConnection("Data Source=Database.sqlite;Version=3;");
        con.Open();
        string sql = "create table 'member' ('account_id' text not null unique, 'account_name' text not null);";
        SQLiteCommand command = new SQLiteCommand(sql, con);
        command.ExecuteNonQuery();
        sql = "insert into member ('account_id', 'account_name') values ('0', '1');";
        command = new SQLiteCommand(sql, con);
        sql = "PRAGMA table_info('member');";
        command = new SQLiteCommand(sql, con);
        SQLiteDataReader reader = command.ExecuteReader();
        while (reader.Read())
        {
            Console.WriteLine(reader.GetName(0));
        }
        con.Close();
    }

}
}

我也尝试过

for(int i=0;i<reader.FieldCount;i++)
{
   Console.WriteLine(reader.GetName(i));
}

var columns = Enumerable.Range(0, reader.FieldCount).Select(reader.GetName).ToList();

我只得到了以下输出结果: "cid name type notnull dflt_value pk" 但是我没有得到真正的列名。 我需要列名,因为我根据另一个服务器API的结果向数据库写入新的列。在打印数据时,我还需要确保正确的列名被显示。

我正在使用 System.Data.SQLite 1.0.103(以防您想知道)。 - Ben
3个回答

8

我真的觉得SQLite讨厌我 - 所以查询不是

PRAGMA table_info('member');

我现在使用
SELECT * FROM member WHERE 1 = 2;

当然,这只会返回表本身而没有任何内容。 但是 - reader.GetName(i) 实际上返回的是真实的列名!花了我5个小时尝试让 'PRAGMA table_info('table_name')' 工作才弄明白这一点...


1
点赞!这对我在Android上有所帮助。执行PRAGMA table-info(my_table_name)返回0。因此,我采用了您的方法并调用了getColumnNames。如果您想检查字段是否存在,则getColumnIndex也是最好的选择。然后就有了魔法。 - FonzTech

6
PRAGMA table_info语句返回类似于查询的数据,即有固定数量的列和若干行,每列都有一个值。每行中的数据对应于您正在查询的表的一列:
sqlite> pragma table_info(member);
cid      name          type     notnull  dflt_value  pk     
-------  ------------  -------  -------  ----------  -------
0        account_id    text     1                    0      
1        account_name  text     1                    0      
调用GetName()返回列名。调用GetString()等方法返回行值:
while (reader.Read()) {
    Console.WriteLine("field name: " + reader.GetString(1));
}

只是为了确保:我希望结果中包含“account_id”和“account_name” - 如屏幕截图所示 - 但我没有得到这些值作为返回..- http://puu.sh/rwfiZ/4166090e28.png - Ben

1

@CL.所说的基础上,我想补充一点。

你可以使用reader.GetOrdinal("ColumnName")来获取正确的列索引。

这类似于cursor.getColumnIndex("ColumnName")

var command = Database.GetDbConnection().CreateCommand();
command.CommandText = $"PRAGMA table_info({entityType.Name});";

using (var reader = command.ExecuteReader())
{
    if (reader.HasRows && reader.Read())
    {
        do
        {
            int columnId = reader.GetInt32(reader.GetOrdinal("cid"));
            string name = reader.GetString(reader.GetOrdinal("name"));
            string type = reader.GetString(reader.GetOrdinal("type"));
            bool notNull = reader.GetBoolean(reader.GetOrdinal("notnull"));
            object defaultValue = reader.GetValue(reader.GetOrdinal("dflt_value"));
            bool primaryKey = reader.GetBoolean(reader.GetOrdinal("pk"));

        } while (reader.Read());
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接