Как я могу получить имена полей таблицы базы данных?

Для меня обновление pip от 8.1.1 до 9.0.1 решило эту проблему.

Вы можете запустить что-то вроде sudo -H pip2 install --upgrade pip, чтобы обновить версию вашего пипса.

9
задан BIBD 13 May 2009 в 14:49
поделиться

7 ответов

, это будет работать на sql server 2005 и новее:

select * from INFORMATION_SCHEMA.COLUMNS 
where TABLE_Name='YourTableName'
order by ORDINAL_POSITION
6
ответ дан 4 December 2019 в 09:38
поделиться

Посмотрите Функцию ниже:

список возвратов имен Атрибутов.

public static List<string> GetTableAttributeNames(DatabaseAccess dba, string tableName)
{
    List<string> list = new List<string>();

    string sSql = string.Format("select * from [{0}] where 1 = 2", tableName);
    using (DataSet ds = dba.GetDataSet(sSql))
    {
        if (ds == null || ds.Tables == null 
            || ds.Tables.Count != 1 || ds.Tables[0].Columns == null)
            return list;

        for (int ndx = 0; ndx < ds.Tables[0].Columns.Count; ndx++)
        {
            DataColumn col = ds.Tables[0].Columns[ndx];
            if (col.AutoIncrement)
                continue;

            string attrName = col.ColumnName;
            list.Add(attrName);
        }
        return list;
    }
}
0
ответ дан 4 December 2019 в 09:38
поделиться

Используйте IDataReader.GetSchemaTable ()

Вот реальный пример, который обращается к схеме таблицы и печатает ее в обычном формате и в формате XML (просто чтобы увидеть, какую информацию вы получите):

class AccessTableSchemaTest
{
    public static DbConnection GetConnection()
    {
        return new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\\Test.mdb");
    }

    static void Main(string[] args)
    {
        using (DbConnection conn = GetConnection())
        {
            conn.Open();

            DbCommand command = conn.CreateCommand();
            // (1) we're not interested in any data
            command.CommandText = "select * from Test where 1 = 0";
            command.CommandType = CommandType.Text;

            DbDataReader reader = command.ExecuteReader();
            // (2) get the schema of the result set
            DataTable schemaTable = reader.GetSchemaTable();

            conn.Close();
        }

        PrintSchemaPlain(schemaTable);

        Console.WriteLine(new string('-', 80));

        PrintSchemaAsXml(schemaTable);

        Console.Read();
    }

    private static void PrintSchemaPlain(DataTable schemaTable)
    {
        foreach (DataRow row in schemaTable.Rows)
        {
            Console.WriteLine("{0}, {1}, {2}",
                row.Field<string>("ColumnName"),
                row.Field<Type>("DataType"),
                row.Field<int>("ColumnSize"));
        }
    }

    private static void PrintSchemaAsXml(DataTable schemaTable)
    {
        StringWriter stringWriter = new StringWriter();
        schemaTable.WriteXml(stringWriter);
        Console.WriteLine(stringWriter.ToString());
    }
}

Интересные места:

  1. Не возвращайте никаких данных, задавая предложение where, которое всегда принимает значение false. Конечно, это применимо только в том случае, если вас не интересуют данные: -).
  2. Используйте IDataReader.GetSchemaTable (), чтобы получить DataTable с подробной информацией о реальной таблице.

Для моей тестовой таблицы результат был:

ID, System.Int32, 4
Field1, System.String, 50
Field2, System.Int32, 4
Field3, System.DateTime, 8
--------------------------------------------------------------------------------
<DocumentElement>
  <SchemaTable>
    <ColumnName>ID</ColumnName>
    <ColumnOrdinal>0</ColumnOrdinal>
    <ColumnSize>4</ColumnSize>
    <NumericPrecision>10</NumericPrecision>
    <NumericScale>255</NumericScale>
    <DataType>System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</DataType>
    <ProviderType>3</ProviderType>
    <IsLong>false</IsLong>
    <AllowDBNull>true</AllowDBNull>
    <IsReadOnly>false</IsReadOnly>
    <IsRowVersion>false</IsRowVersion>
    <IsUnique>false</IsUnique>
    <IsKey>false</IsKey>
    <IsAutoIncrement>false</IsAutoIncrement>
  </SchemaTable>
  [...]
</DocumentElement>
8
ответ дан 4 December 2019 в 09:38
поделиться

Выполните этот запрос:

select top 1 *
From foo

, а затем просмотрите поля списка (и возвращенные значения) в наборе результатов, чтобы получить имена полей.

4
ответ дан 4 December 2019 в 09:38
поделиться

Вы спрашиваете, как получить имена столбцов таблицы в базе данных?

Если да, то это полностью зависит от используемого сервера базы данных.

В SQL 2005 вы можно выбрать из представления INFORMATION_SCHEMA.Columns

SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'MyTable'

В SQL 2000 вы можете присоединить SysObjects к SysColumns, чтобы получить информацию

SELECT     
    dbo.sysobjects.name As TableName
    , dbo.syscolumns.name AS FieldName
FROM
    dbo.sysobjects 
    INNER JOIN dbo.syscolumns 
         ON dbo.sysobjects.id = dbo.syscolumns.id
WHERE
    dbo.sysobjects.name = 'MyTable'
2
ответ дан 4 December 2019 в 09:38
поделиться

Используйте классы автоматизации DAO. Возможно, у вас уже есть библиотека взаимодействия для него в вашей установке Visual Studio. Если нет, его достаточно легко создать; просто добавьте ссылку на библиотеку DAO COM.

using dao;
...
DBEngineClass dbengine = new DBEngineClass();
dbengine.OpenDatabase(path, null, null, null);
Database database = dbengine.Workspaces[0].Databases[0];
List<string> fieldnames = new List<string>();
TableDef tdf = database.TableDefs[tableName];
for (int i = 0; i < tdf.Fields.Count; i++)
{
    fieldnames.Add(tdf.Fields[i].Name);
}
database.Close();
dbengine.Workspaces[0].Close();

Это так же просто, как запрос к системной таблице (что, как я считаю, проблематично в Access), и таким образом вы можете получить много дополнительной информации.

] EDIT: Я изменил код из того, что опубликовал вчера, который я только что перевел с VB.NET, и в котором не хватало пары частей. Я переписал его и протестировал на C # в VS2008.

1
ответ дан 4 December 2019 в 09:38
поделиться

Depending on the DB engine your using you can easily query the DB system tables for that information

For access i can't find the answer i know you can see the sys tables in access and from there you could try and determine where that information is but im not really sure how to do this part. tried using an example but got nowwhere

0
ответ дан 4 December 2019 в 09:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: