6 votes

Comment obtenir les noms des colonnes d'une table dans sqlite via PRAGMA (.net / c#) ?

J'ai eu du mal à trouver le bon code c# pour obtenir les valeurs après une requête PRAGMA table_info.

Puisque mon édition avec du code supplémentaire a été rejetée dans <a href="https://stackoverflow.com/questions/721307/how-can-i-get-a-fast-overview-over-an-table-structure-in-sqlite">ce poste </a>J'ai posé cette question pour d'autres personnes qui, autrement, auraient perdu des heures à chercher une solution rapide.

14voto

trippino Points 3262

En supposant que vous voulez un DataTable avec la liste des champs de votre table :

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

Le résultat du retour est :

  • cid : id de la colonne
  • name : le nom de la colonne
  • type : le type de la colonne
  • notnull : 0 ou 1 si la colonne peut contenir des valeurs nulles
  • dflt_value : la valeur par défaut
  • pk : 0 ou 1 si la colonne participe à la clé primaire.

Si vous voulez seulement les noms des colonnes dans un List que vous pouvez utiliser (vous devez inclure System.Data.DataSetExtension ) :

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

EDIT : Ou vous pouvez éviter le DataSetExtension en utilisant ce code :

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

Il y a beaucoup de PRAGMA que vous pouvez utiliser dans SQLite, consultez le lien.

A propos de la using C'est très simple, il est utilisé pour s'assurer que les objets jetables seront éliminés quoi qu'il arrive dans votre code : cf. ce lien o cette référence

1voto

R-U-Bn Points 1749

Code :

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

Tous les éléments des lignes résultantes :
int cid, string name, string type,int notnull, string dflt_value, int pk

Plus d'informations sur PRAGMA

-1voto

Andrew Seabrook Points 46

Je ne sais pas si c'est exactement ce que vous recherchez, mais c'est ainsi que j'ai récupéré les données et que je les ai ensuite utilisées. J'espère que cela vous aidera ! Évidemment, le commutateur ne couvre pas toutes les éventualités, seulement celles dont j'ai eu besoin jusqu'à présent.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X