繁体   English   中英

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

[英]SQLite PRAGMA table_info(table) not returning column names (using Data.SQLite in C#)

我使用以下示例代码并希望以某种方式获取 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。 打印数据时,我想确保显示正确的列名。

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

PRAGMA table_info('member');

我现在用

SELECT * FROM member WHERE 1 = 2;

这当然只会返回表格本身而没有任何内容。 但是 - reader.GetName(i) 实际上是返回真实的列名! 我只花了 5 个小时试图让 'PRAGMA table_info('table_name')' 工作来解决这个问题......

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

只是为了添加@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());
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM