2013-07-18 11 views
5

Ho faticato a ottenere il codice C# corretto per ottenere i valori dopo una query table_info PRAGMA.Come ottenere i nomi delle colonne da una tabella in sqlite tramite PRAGMA (.net/C#)?

Poiché la mia modifica con codice aggiuntivo è stata rifiutata in this post, ho fatto questa domanda ad altre persone che altrimenti avrebbero sprecato ore per una soluzione veloce.

+0

E non hai risposto alla domanda perché? (o aggiungi un commento alla risposta a cui ti colleghi, che probabilmente sarebbe stato meglio) –

+0

Intendi questa domanda (1) o l'altra (2)?1: Perché StackOverflow mi consente di farlo solo dopo 2 ore (che ho realizzato solo dopo aver fatto la domanda). 2: Perché la risposta sarebbe stata doppia (e quindi una modifica è migliore) –

risposta

10

Supponendo che si desidera un DataTable con l'elenco di campo della tabella:

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

risultato di ritorno è:

  • cid: id della colonna
  • nome: il nome di la colonna
  • tipo: il tipo della colonna
  • notnull: 0 o 1 se il barattolo colonna contiene valori nulli
  • dflt_value: il valore di default
  • pk: 0 o 1 se la colonna partecipa alla chiave primaria

Se si desidera che solo i nomi delle colonne in un List è possibile utilizzare (è necessario includere System.Data.DataSetExtension):

return table.AsEnumerable().Select(r=>r["name"].ToString()).ToList(); 

EDIT: Oppure si può evitare il riferimento DataSetExtension utilizzando questo codice:

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

Ci sono molte istruzioni PRAGMA che è possibile utilizzare in SQLite, dare un'occhiata al collegamento.

circa la dichiarazione using: è molto semplice, è usato per essere sicuri che gli oggetti usa e getta saranno smaltiti ciò che può accadere nel codice: vedi this link o this reference

+0

Mi dispiace, ma stavo per rispondere alla mia stessa domanda. (Dal momento che non volevo che altre persone si bloccassero come prima di trovarlo.) Eri troppo veloce per quello. (E posso farlo solo dopo 2 giorni.) –

+0

Hai dovuto modificare la tua domanda precedente dando la soluzione completa, non per pubblicare un'altra domanda. : -/ –

+0

La domanda precedente non è mia. –

1

Codice:

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 

Tutti elementi nelle righe portato:
int cid, string name, string type,int notnull, string dflt_value, int pk

Maggiori informazioni PRAGMA

-1

Non sono sicuro se questo esattamente quello che sono dopo, ma questo è come ho afferrato i dati e successivamente utilizzato. Spero che sia d'aiuto! Ovviamente l'interruttore non copre tutte le eventualità, solo quelle che ho avuto bisogno fino ad ora.

/// <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; 
    } 
+0

Mi dispiace, ma non voglio aggiornare nulla. –

+0

Beh, mi dispiace tanto per questo ho pensato che il punto della domanda era come ottenere i tipi di colonna> Esiste un comando come "mostra colonne da TABLENAME"? Ho bisogno di qualcosa per vedere solo la struttura del tavolo. –

Problemi correlati