2015-08-26 4 views
0

Я использую 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; 
    } 

} 

Любая помощь очень ценится! :)

ответ

2

Я думаю, проблема в вашем SQL-запросе. вы должны установить имя для каждого столбца, который вы хотите извлечь из таблиц. так что вы можете использовать этот запрос:

SELECT table_1.ID as Tbl1_ID, table_2.ID as Tbl2_ID FROM table_1 JOIN table_2 ON table_1.id = table_2.id; 

теперь вы можете прочитать значение каждого столбца по его имени, например:

reader["Tbl1_ID"]; 

или это показатель, как:

reader[0]; 
+0

Это довольно хорошее обходное решение. Однако, когда я запускаю этот запрос, я не знаю столбцов, которые присутствуют в таблице (это может быть программно вычислено), и я всегда хочу всех столбцов, поэтому я делал «SELECT * FROM». ..' заявление. –

+0

Это причина, по которой вам не следует использовать 'SELECT *'. –

+0

Да, возможно, все будет работать лучше, если я вернусь к чертежной доске и избавлюсь от 'SELECT *' –