Как получить имена столбцов из таблицы в sqlite через PRAGMA (.net / c#)?
Я изо всех сил пытался получить правильный код c# для получения значений после запроса PRAGMA table_info.
Так как мое редактирование с дополнительным кодом было отклонено в этот пост, Я сделал этот вопрос для других людей, которые в противном случае тратить часы на быстрое решение.
3 ответов
если вы хотите DataTable
со списком полей вашей таблицы:
using (var con = new SQLiteConnection(preparedConnectionString))
{
using (var cmd = new SQLiteCommand("PRAGMA table_info(" + tableName + ");"))
{
var table = new DataTable();
cmd.Connection = con;
cmd.Connection.Open();
SQLiteDataAdapter adp = null;
try
{
adp = new SQLiteDataAdapter(cmd);
adp.Fill(table);
con.Close();
return table;
}
catch (Exception ex)
{ }
}
}
возврат результат:
- cid: id столбца
- name: название столбца
- type: тип столбца
- notnull: 0 или 1, Если столбец может содержать значения null
- dflt_value: значение по умолчанию:
- pk: 0 или 1, Если столбец partecipate к первичному ключу
если вы хотите только имена столбцов в List
вы можете использовать (вы должны включить System.Data.DataSetExtension
):
return table.AsEnumerable().Select(r=>r["name"].ToString()).ToList();
EDIT: или вы можете избежать DataSetExtension
ссылка с помощью этого кода:
using (var con = new SQLiteConnection(preparedConnectionString))
{
using (var cmd = new SQLiteCommand("PRAGMA table_info(" + tableName + ");"))
{
var table = new DataTable();
cmd.Connection = con;
cmd.Connection.Open();
SQLiteDataAdapter adp = null;
try
{
adp = new SQLiteDataAdapter(cmd);
adp.Fill(table);
con.Close();
var res = new List<string>();
for(int i = 0;i<table.Rows.Count;i++)
res.Add(table.Rows[i]["name"].ToString());
return res;
}
catch (Exception ex){ }
}
}
return new List<string>();
много ПРАГМА операторы, которые вы можете использовать в SQLite, посмотрите на ссылку.
о using
заявление: это очень просто, он используется, чтобы быть уверенным, что одноразовые объекты будут утилизированы все, что может произойти в вашем коде: см. этой ссылке или этой ссылке
код:
DB = new SQLiteConnection(@"Data Source="+DBFileName);
DB.Open();
SQLiteCommand command = new SQLiteCommand("PRAGMA table_info('tracks')", DB);
DataTable dataTable = new DataTable();
SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(command);
dataAdapter.Fill(dataTable);
DB.Close();
foreach (DataRow row in dataTable.Rows) {
DBColumnNames.Add((string)row[dataTable.Columns[1]]); }
//Out(String.Join(",",
DBColumnNames.ToArray()));//debug
все элементы в результирующих строках:int cid, string name, string type,int notnull, string dflt_value, int pk
подробнее о ПРАГМА
Не уверен, что это именно то, что вам нужно, но именно так я схватил данные и впоследствии использовал их. Надеюсь, это поможет! Очевидно, что переключатель не охватывает все случайности, только те, которые мне нужны до сих пор.
/// <summary>
/// Allows the programmer to easily update rows in the DB.
/// </summary>
/// <param name="tableName">The table to update.</param>
/// <param name="data">A dictionary containing Column names and their new values.</param>
/// <param name="where">The where clause for the update statement.</param>
/// <returns>A boolean true or false to signify success or failure.</returns>
public bool Update(String tableName, Dictionary<String, String> data, String where)
{
String vals = "";
Boolean returnCode = true;
//Need to determine the dataype of fields to update as this affects the way the sql needs to be formatted
String colQuery = "PRAGMA table_info(" + tableName + ")";
DataTable colDataTypes = GetDataTable(colQuery);
if (data.Count >= 1)
{
foreach (KeyValuePair<String, String> pair in data)
{
DataRow[] colDataTypeRow = colDataTypes.Select("name = '" + pair.Key.ToString() + "'");
String colDataType="";
if (pair.Key.ToString()== "rowid" || pair.Key.ToString()== "_rowid_" || pair.Key.ToString()=="oid")
{
colDataType = "INT";
}
else
{
colDataType = colDataTypeRow[0]["type"].ToString();
}
colDataType = colDataType.Split(' ').FirstOrDefault();
if ( colDataType == "VARCHAR")
{
colDataType = "VARCHAR";
}
switch(colDataType)
{
case "INTEGER": case "INT": case "NUMERIC": case "REAL":
vals += String.Format(" {0} = {1},", pair.Key.ToString(), pair.Value.ToString());
break;
case "TEXT": case "VARCHAR": case "DATE": case "DATETIME":
vals += String.Format(" {0} = '{1}',", pair.Key.ToString(), pair.Value.ToString());
break;
}
}
vals = vals.Substring(0, vals.Length - 1);
}
try
{
string sql = String.Format("update {0} set {1} where {2};", tableName, vals, where);
//dbl.AppendLine(sql);
dbl.AppendLine(sql);
this.ExecuteNonQuery(sql);
}
catch(Exception crap)
{
OutCrap(crap);
returnCode = false;
}
return returnCode;
}