6

PRAGMA table_info クエリの後に値を取得するための適切な c# コードを取得するのに苦労しています。

余分なコードを含む私の編集はこの投稿で拒否されたので、迅速な解決のために何時間も無駄にする他の人のためにこの質問をしました。

4

3 に答える 3

14

DataTableテーブルのフィールドのリストが必要であると仮定します。

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

返される結果は次のとおりです。

  • cid: 列の ID
  • name: 列の名前
  • type: 列のタイプ
  • notnull: 列に null 値を含めることができる場合は 0 または 1
  • dflt_value: デフォルト値
  • pk: 列が主キーに含まれる場合は 0 または 1

列名のみを に入れたい場合は、List次を使用できます ( を含める必要がありますSystem.Data.DataSetExtension)。

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

編集:DataSetExtensionまたは、このコードを使用して参照を回避できます:

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

SQLite で使用できるPRAGMAステートメントは多数あります。リンクを参照してください。

ステートメントについてusing: これは非常に単純です。コード内で発生する可能性のある使い捨てオブジェクトが確実に破棄されるようにするために使用されます:このリンクまたはこの参照を参照してください。

于 2013-07-18T08:02:49.897 に答える
1

コード:

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

結果の行のすべての要素:
int cid, string name, string type,int notnull, string dflt_value, int pk

プラグマの詳細

于 2013-07-18T08:04:42.923 に答える
-1

これがまさにあなたが求めているものかどうかはわかりませんが、これが私がデータを取得してその後使用した方法です。それが役に立てば幸い!明らかに、スイッチはすべての不測の事態をカバーしているわけではなく、これまで必要だったものだけをカバーしています.

    /// <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;
    }
于 2013-08-07T13:19:17.950 に答える