获取表的字段数据类型

jisenjushi 2005-03-19 04:07:04
如何通过代码获取(SQL Server, Access,Oracle)中,表的字段的数据类型?
例:Table tb1中
ID(varchar) age(int) date(datetime)
1235600 12 2005-03-18

在未知表的结构的情况下,如何获取:表头的字段名称(ID,age,date)及他们的类型
(varhar, int, datetime);
...全文
646 点赞 收藏 7
写回复
7 条回复
机器人 2005年03月19日
用datareader的GetSchemaTable方法。

OleDbDataReader.GetSchemaTable 方法返回一个 DataTable,它描述 OleDbDataReader 的列元数据。
GetSchemaTable 方法映射到 OLE DB IColumnsRowset::GetColumnsRowset 方法,并按照以下顺序返回有关每一列的元数据:

DataReader 列 OLE DB 列 ID 说明
ColumnName DBCOLUMN_NAME 列的名称;它可能不唯一。如果无法确定该名称,则返回空值。此名称始终反映最近对当前视图或命令文本中的列进行的重命名。
ColumnOrdinal DBCOLUMN_NUMBER 列的序号。它对于行的书签列(如果有的话)为零。其他列从一开始编号。该列不能包含空值。
ColumnSize DBCOLUMN_COLUMNSIZE 列中值的最大可能长度。对于采用固定长度数据类型的列,它是该数据类型的大小。
NumericPrecision DBCOLUMN_PRECISION 如果 DbType 是数值数据类型,则它是列的最大精度。数据类型为 DBTYPE_DECIMAL 或 DBTYPE_NUMERIC 的列的精度取决于该列的定义。如果 DbType 不是数值数据类型,则它为空值。
NumericScale DBCOLUMN_SCALE 如果 DbType 是 DBTYPE_DECIMAL 或 DBTYPE_NUMERIC,则它是小数点右侧的位数。否则,它为空值。
DataType None 映射到列的 .Net Framework 类型。
ProviderType DBCOLUMN_TYPE 列的数据类型的指示符。如果不同行的列数据类型不同,则它必须为 DBTYPE_VARIANT。该列不能包含空值。
IsLong DBCOLUMNFLAGS_ISLONG 如果列中有包含非常长的数据的二进制长对象 (BLOB),则提供程序设置 DBCOLUMNFLAGS_ISLONG。非常长的数据的定义针对于提供程序。此标志的设置对应于该数据类型的 PROVIDER_TYPES 行集合中 IS_LONG 列的值。
AllowDBNull DBCOLUMNFLAGS_ISNULLABLE 如果使用者可将列设置为空值,或者提供程序无法确定使用者是否可将列设置为空值,则提供程序设置 DBCOLUMNFLAGS_ISNULLABLE。即使列无法设置为空值,它仍可能包含空值。
IsReadOnly DBCOLUMNFLAGS_WRITE 如果不能修改该列,则为 true;否则为 false。如果提供程序已经设置了 DBCOLUMNFLAGS_WRITE 或 DBCOLUMNFLAGS_WRITEUNKNOWN 标志,则认为该列是可写的。
IsRowVersion DBCOLUMNFLAGS_ISROWID 如果列包含不能写入的持久性行标识符,并且该标识符除了标识行以外没有其他有意义的值,则提供程序设置 DBCOLUMNFLAGS_ISROWID。
IsUnique DBCOLUMN_ISUNIQUE VARIANT_TRUE:在该列中,基表(返回到 BaseTableName 中的表)中的任意两行的值都不能相同。如果该列单独指定关键字,或者有一个只应用于该列的 UNIQUE 类型的约束,则 IsUnique 保证为 VARIANT_TRUE。VARIANT_FALSE:该列包含基表中的重复值。此列的默认值为 VARIANT_FALSE。
IsKey DBCOLUMN_KEYCOLUMN VARIANT_TRUE:该列属于行集中的列集,结合使用列集中的列可唯一标识行。IsKey 设置为 VARIANT_TRUE 的列集必须唯一标识行集中的行。不要求此列集是最小列集。这组列可以从基表主键、唯一约束或唯一索引生成。VARIANT_FALSE:不要求该列唯一标识行。
IsAutoIncrement DBCOLUMN_ISAUTOINCREMENT VARIANT_TRUE:该列以固定的增量向新行赋值。VARIANT_FALSE:该列不会以固定增量为新行赋值。此列的默认值为 VARIANT_FALSE。
BaseSchemaName DBCOLUMN_BASESCHEMANAME 包含列的数据存储区中的架构的名称。如果无法确定基架构名称,则为空值。该列的默认值为空值。
BaseCatalogName DBCOLUMN_BASECATALOGNAME 包含列的数据存储区中的目录的名称。如果无法确定基目录名称,则为空值。该列的默认值为空值。
BaseTableName DBCOLUMN_BASETABLENAME 包含列的数据存储区中的表或视图的名称。如果无法确定基表名称,则为空值。该列的默认值为空值。
BaseColumnName DBCOLUMN_BASECOLUMNNAME 数据存储区中列的名称。如果使用别名,它可能不同于在 ColumnName 列中返回的列名称。如果无法确定基列名称,或者如果行集合列从数据存储区中的列导出但不等于该列,则为空值。该列的默认值为空值。

注意 若要确保元数据列返回正确的信息,必须调用 behavior 参数设置为 KeyInfo 的 ExecuteReader。否则,架构中的一些列可能返回默认的、空的或不正确的数据。

回复 点赞
CSharpProgrammer 2005年03月19日
select a.name --字段名
,c.name --数据类型
from syscolumns a,
sysobjects b,
systypes c
where a.id=b.id and a.xtype=c.xtype
and b.name='table_name'
回复 点赞
CruelYoung123 2005年03月19日
如果是Varchar类型
“MessageBox.Show(dt.Columns[i].ColumnName.ToString() + " and " +dt.Columns[i].DataType.ToString());”便读出的是string类型
回复 点赞
CruelYoung123 2005年03月19日
wmt85(深山老翁):
DataTable支持的类型好像与DataSet及XML相同。
而与SQL Server表中的类型不一致
回复 点赞
深山老翁 2005年03月19日
for(int i=0;i<dt.Columns.Count;i++)
{
MessageBox.Show(dt.Columns[i].ColumnName.ToString() + " and " +dt.Columns[i].DataType.ToString());
}
________________
dt是DataTable,内存表!
回复 点赞
v192 2005年03月19日
据说查系统表可以知道,帮你顶一下
回复 点赞
corbet 2005年03月19日
帮你顶一下!
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.5w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告