我使用以下示例代码,并希望以某种方式获取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的结果将新列写入数据库。打印数据时,我想确保显示正确的列名。
答案 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());
}
}