如何return所有列的名称?

How to return names of all columns?

通过搜索,我找到了 PRAGMA 作为我的问题的可能解决方案,但它只有 return 每列的索引。还有其他方法可以 return 所有列名吗?

我认为使用 For 来遍历我的列索引 returning 他们的名字会很好,但我不知道它的语法是怎样的,无论是停止条件。

void FillColumnList()
        {
            try
            {
                string check = "SELECT * FROM PRAGMA table_info(Produtos)";
                sqlCon.Open();
                SQLiteCommand tst2 = new SQLiteCommand(check, sqlCon);
                SQLiteDataReader rdr2 = tst2.ExecuteReader();                
                if (rdr2.HasRows)
                {
                    while (rdr2.Read())
                    {
                        string columns = rdr2[0].ToString();
                        Columns.Add(columns);
                    }
                    sqlCon.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }            
        }

此代码应 return 并用 "Produtos" table 的每一列的名称填充全局变量列表列。而不是它,我的 DataReader 'rdr2' return 在 HasRows 中为 false,即使我的 table "Produtos"

中有列和数据

您可以使用连接的 GetSchema 方法来检索列信息。我正在使用以下代码插入我自己的信息 class TableColumn 此处未显示:

string[] restrictions = new string[] { null, null, tableName };

using (DataTable columns = conn.GetSchema("Columns", restrictions)) {
    int nameIndex = columns.Columns.IndexOf("COLUMN_NAME");
    int ordinalPosIndex = columns.Columns.IndexOf("ORDINAL_POSITION");
    int isNullableIndex = columns.Columns.IndexOf("IS_NULLABLE");
    int maxLengthIndex = columns.Columns.IndexOf("CHARACTER_MAXIMUM_LENGTH");
    int dataTypeIndex = columns.Columns.IndexOf("DATA_TYPE");
    int isPrimaryKeyIndex = columns.Columns.IndexOf("PRIMARY_KEY");
    int hasDefaultIndex = columns.Columns.IndexOf("COLUMN_HASDEFAULT");
    int defaultValueIndex = columns.Columns.IndexOf("COLUMN_DEFAULT");

    foreach (DataRow row in columns.Rows) {
        var col = new TableColumn {
            ColumnName = (string)row[nameIndex]
        };
        try {
            col.ColumnNameForMapping = prepareColumnNameForMapping(col.ColumnName);
        } catch (Exception ex) {
            throw new UnimatrixExecutionException("Error in delegate 'prepareColumnNameForMapping'", ex);
        }
        col.ColumnOrdinalPosition = (int)row[ordinalPosIndex];
        col.ColumnAllowsDBNull = (bool)row[isNullableIndex];
        col.ColumnMaxLength = (int)row[maxLengthIndex];

        string explicitDataType = ((string)row[dataTypeIndex]).ToLowerInvariant();
        col.ColumnDbType = GetColumnDbType(explicitDataType);
        col.ColumnIsPrimaryKey = (bool)row[isPrimaryKeyIndex];
        col.ColumnIsIdentity = explicitDataType == "integer" && col.ColumnIsPrimaryKey;
        col.ColumnIsReadOnly = col.ColumnIsIdentity;

        if ((bool)row[hasDefaultIndex]) {
            col.ColumnDefaultValue = GetDefaultValue(col.ColumnDbType, (string)row[defaultValueIndex]);
            if (col.ColumnDefaultValue == null) { // Default value could not be determined. Probably expression.
                col.AutoAction = ColumnAction.RetrieveAfterInsert;
            }
        }
        tableSchema.ColumnSchema.Add(col);
    }
}

如果您只需要列名,则可以大大简化此代码。