Я использую System.Data.SQLite
. Я пишу программу на C#, которая читает данные из любой базы данных SQLite. Эта программа запускает ряд запросов по данной базе данных. Я запрашиваю таблицу sqlite_master
для определения таблиц в базе данных и затем запускаю операторы PRAGMA
, чтобы получить схему каждой из таблиц.Как определить таблицу владельца столбца, возвращаемого SQLite-запросом в C#
Моя основная проблема; когда я делаю SELECT * FROM table_1 JOIN table_2 ON table_1.id = table_2.id;
, я не могу найти способ определить, из какой таблицы возникает каждый столбец идентификатора.
Я надеюсь, что кто-то сможет указать мне в направлении определения таблицы, из которой состоит каждый столбец в результате запроса.
Мне удалось получить данные в NameValueCollection
, которые не обрабатывают дубликаты имен столбцов так, как мне хотелось бы. Мне бы понравился словарь с именем таблицы в качестве ключа со словарем столбцов в качестве значения; Пример ниже:
{"table_1": {"col_1": value, "col_2": value}, "table_2": {"col_1": value, "col_2": value}}
Или квалифицированное имя столбца, чтобы я мог получить доступ к вещам, как:
reader["table_name.column_name"];
Я также был в состоянии получить данные из запроса в DataTable, который не получить данные в каком-то смысле мне бы понравились. Столбец id из приведенного выше примера просто добавляется с номером 1, чтобы указать, что он дублируется.
Две функции я использую, чтобы вернуть NameValueCollections и DataTable ниже:
class DatabaseReader
{
private string ConnectionString;
public DatabaseReader(string ConnectionString)
{
this.ConnectionString = ConnectionString;
}
/// <summary>
/// Returns a NameValueCollection of the query result
/// </summary>
/// <param name="query">The query to be run</param>
public IEnumerable<NameValueCollection> ExecuteReader(string query)
{
SQLiteCommand command = new SQLiteCommand();
command.CommandText = query;
using (SQLiteConnection conn = new SQLiteConnection(this.ConnectionString))
{
conn.Open();
// Do things with the open connection
command.Connection = conn;
SQLiteDataReader reader;
using (command)
{
reader = command.ExecuteReader();
}
if (reader != null)
{
while (reader.Read())
{
yield return reader.GetValues();
}
}
else
{
throw new Exception(string.Format("{0} query returned nothing"));
}
}
}
/// <summary>
/// Returns a DataTable of the query result
/// </summary>
/// <param name="query">The query to be run</param>
public DataTable GetDataTable(string query)
{
DataTable dt = new DataTable();
try
{
using (SQLiteConnection cnn = new SQLiteConnection(this.ConnectionString))
{
cnn.Open();
using (SQLiteCommand mycommand = new SQLiteCommand(cnn))
{
mycommand.CommandText = query;
using (SQLiteDataReader reader = mycommand.ExecuteReader())
{
dt.Load(reader);
reader.Close();
}
}
cnn.Close();
}
}
catch (Exception e)
{
throw new Exception(e.Message);
}
return dt;
}
}
Любая помощь очень ценится! :)
Это довольно хорошее обходное решение. Однако, когда я запускаю этот запрос, я не знаю столбцов, которые присутствуют в таблице (это может быть программно вычислено), и я всегда хочу всех столбцов, поэтому я делал «SELECT * FROM». ..' заявление. –
Это причина, по которой вам не следует использовать 'SELECT *'. –
Да, возможно, все будет работать лучше, если я вернусь к чертежной доске и избавлюсь от 'SELECT *' –