SQLite PRAGMA table_info(表)不返回列名(在C#中使用Data.SQLite)

时间:2016-10-03 03:36:28

标签: c# sqlite

我使用以下示例代码,并希望以某种方式获取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();

我得到的唯一结果是以下输出: &#34; cid名称类型notnull dflt_value pk&#34; 我虽然没有得到实际的列名.. 我确实需要列名,因为我根据来自另一个我无法访问的服务器的API的结果将新列写入数据库。打印数据时,我想确保显示正确的列名。

3 个答案:

答案 0 :(得分:5)

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));
}

答案 1 :(得分:2)

我真的认为SQLite讨厌我 - 所以而不是查询蜜蜂

PRAGMA table_info('member');

我现在用

SELECT * FROM member WHERE 1 = 2;

这当然只会让我自己没有任何内容。 但是 - reader.GetName(i)实际上是返回真正的列名!我只花了5个小时试图制作PRAGMA table_info(&#39; table_name&#39;)&#39;努力弄清楚......

答案 2 :(得分:0)

只需在@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());
    }
}