Для меня обновление pip от 8.1.1 до 9.0.1 решило эту проблему.
Вы можете запустить что-то вроде sudo -H pip2 install --upgrade pip
, чтобы обновить версию вашего пипса.
, это будет работать на sql server 2005 и новее:
select * from INFORMATION_SCHEMA.COLUMNS
where TABLE_Name='YourTableName'
order by ORDINAL_POSITION
Посмотрите Функцию ниже:
список возвратов имен Атрибутов.
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;
}
}
Используйте 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());
}
}
Интересные места:
Для моей тестовой таблицы результат был:
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>
Выполните этот запрос:
select top 1 *
From foo
, а затем просмотрите поля списка (и возвращенные значения) в наборе результатов, чтобы получить имена полей.
Вы спрашиваете, как получить имена столбцов таблицы в базе данных?
Если да, то это полностью зависит от используемого сервера базы данных.
В 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'
Используйте классы автоматизации 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.
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