如何通过代码获取(SQL Server, Access,Oracle)中,表的字段的数据类型?
   例:Table tb1中
       ID(varchar)   age(int)    date(datetime)
        1235600        12          2005-03-18
  
       在未知表的结构的情况下,如何获取:表头的字段名称(ID,age,date)及他们的类型 
                                                              (varhar, int, datetime);

解决方案 »

  1.   

    for(int i=0;i<dt.Columns.Count;i++)
    {
         MessageBox.Show(dt.Columns[i].ColumnName.ToString() + " and " +dt.Columns[i].DataType.ToString());
    }
    ________________
    dt是DataTable,内存表!
      

  2.   

    wmt85(深山老翁):
    DataTable支持的类型好像与DataSet及XML相同。
    而与SQL Server表中的类型不一致
      

  3.   

    如果是Varchar类型
    “MessageBox.Show(dt.Columns[i].ColumnName.ToString() + " and " +dt.Columns[i].DataType.ToString());”便读出的是string类型
      

  4.   

    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'
      

  5.   

    用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。否则,架构中的一些列可能返回默认的、空的或不正确的数据。