2013-07-18 10 views
5

Starałem się uzyskać prawidłowy kod C# do uzyskania wartości po zapytaniu PRAGMA table_info.Jak uzyskać nazwy kolumn z tabeli w sqlite przez PRAGMA (.net/C#)?

Ponieważ moja edycja z dodatkowym kodem została odrzucona w this post, zadałem to pytanie innym osobom, które w przeciwnym razie tracą godziny na szybkie rozwiązanie.

+0

A ty nie odpowiedziałeś na pytanie, ponieważ? (lub dodaj komentarz do odpowiedzi, do której linkujesz, co prawdopodobnie byłoby lepiej). –

+0

Masz na myśli to pytanie (1) lub inne (2)?1: Ponieważ stackoverflow pozwala mi to zrobić po 2 godzinach (co zrealizowałem dopiero po zadaniu pytania). 2: Ponieważ odpowiedź byłaby podwójna (a zatem zmiana jest lepsza) –

Odpowiedz

10

Zakładając chcesz DataTable z listy pola tabeli:

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

return result jest:

  • cid: id kolumny
  • name: nazwa Typ kolumny: typ kolumny
  • : typ kolumny
  • notnull: 0 lub 1 jeśli puszka kolumna zawiera wartości null
  • dflt_value: wartość domyślną
  • pk: 0 lub 1, jeśli partecipate kolumna klucza podstawowego

Jeśli chcesz tylko nazwy kolumn w List można wykorzystać (trzeba to System.Data.DataSetExtension):

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

EDIT: Albo można uniknąć odniesienia DataSetExtension przy użyciu tego kodu:

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

Istnieje wiele instrukcji PRAGMA, których można używać w SQLite, spójrz na link.

O rachunku using: to bardzo proste, jest on stosowany, aby mieć pewność, że jednorazowe obiekty zostaną umieszczone co może się zdarzyć w kodzie: patrz this link lub this reference

+0

Przykro mi, ale zamierzałem odpowiedzieć na moje własne pytanie. (Ponieważ nie chciałem, aby inni ludzie utknęli tak jak ja, zanim to odkryłem.) Byłeś zbyt szybki. (Mogę to zrobić tylko po 2 dniach.) –

+0

Musiałeś zmienić swoje poprzednie pytanie, podając kompletne rozwiązanie, a nie po to, aby opublikować kolejne pytanie. : -/ –

+0

Poprzednie pytanie nie jest moje. –

1

Kod:

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 

Wszystkie elementy w wynikowych wierszach:
int cid, string name, string type,int notnull, string dflt_value, int pk

Więcej informacji na PRAGMA

-1

nie wiem, czy to dokładnie to, czego po, ale to jak mam chwycił dane, a następnie wykorzystane. Mam nadzieję, że to pomoże! Oczywiście zmiana nie obejmuje wszystkich ewentualności, tylko tych, których potrzebowałem do tej pory.

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

Przykro mi, ale nie chcę niczego aktualizować. –

+0

Cóż, przepraszam za to. Pomyślałem, że chodzi o pytanie, w jaki sposób uzyskać typy kolumn> Czy jest jakieś polecenie, takie jak "pokaż kolumny z TABLENAME"? Potrzebuję czegoś, żeby zobaczyć strukturę tabeli. –

Powiązane problemy