如题,用的联接是System.Data.OleDb.OleDbConnection,数据库是Access。

解决方案 »

  1.   

    MSSQL 是这样
    select syscolumns.name AS  ColumnName,systypes.name  AS TypeName,syscolumns.length  as length
     from syscolumns,sysobjects,systypes where syscolumns.id=sysobjects.id and  syscolumns.xtype= systypes.xtype 
     and systypes.name<>'sysname' and  sysobjects.name= '表名' order by syscolumns.colid
      

  2.   

    ACCESS不懂,sql的话,看看邹老大写的:
    SELECT 
    表名=case when a.colorder=1 then d.name else '' end,
    表说明=case when a.colorder=1 then isnull(f.value,'') else '' end,
    字段序号=a.colorder,
    字段名=a.name,
    标识=case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else '' end,
    主键=case when exists(SELECT 1 FROM sysobjects where xtype='PK' and parent_obj=a.id and name in (
    SELECT name FROM sysindexes WHERE indid in(
    SELECT indid FROM sysindexkeys WHERE id = a.id AND colid=a.colid
    ))) then '√' else '' end,
    类型=b.name,
    占用字节数=a.length,
    长度=COLUMNPROPERTY(a.id,a.name,'PRECISION'),
    小数位数=isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0),
    允许空=case when a.isnullable=1 then '√'else '' end,
    默认值=isnull(e.text,''),
    字段说明=isnull(g.[value],''),
    索引名称=isnull(h.索引名称,''),
    索引顺序=isnull(h.排序,'')
    FROM syscolumns a
    left join systypes b on a.xtype=b.xusertype
    inner join sysobjects d on a.id=d.id  and d.xtype='U' and d.status>=0
    left join syscomments e on a.cdefault=e.id
    left join sysproperties g on a.id=g.id and a.colid=g.smallid  
    left join sysproperties f on d.id=f.id and f.smallid=0
    left join(--这部分是索引信息,如果要显示索引与表及字段的对应关系,可以只要此部分
    select 索引名称=a.name,c.id,d.colid
    ,排序=case indexkey_property(c.id,b.indid,b.keyno,'isdescending')
    when 1 then '降序' when 0 then '升序' end
    from sysindexes a
    join sysindexkeys b on a.id=b.id and a.indid=b.indid
    join (--这里的作用是有多个索引时,取索引号最小的那个
    select id,colid,indid=min(indid) from sysindexkeys
    group by id,colid) b1 on b.id=b1.id and b.colid=b1.colid and b.indid=b1.indid
    join sysobjects c on b.id=c.id and c.xtype='U' and c.status>=0
    join syscolumns d on b.id=d.id and b.colid=d.colid
    where a.indid not in(0,255)
    ) h on a.id=h.id and a.colid=h.colid
    --where d.name='要查询的表'    --如果只查询指定表,加上此条件
    order by a.id,a.colorder
      

  3.   

    2楼大佬,您可以简单解说一下您的SQL语句含义吗‘?比如: 表名=case when a.colorder=1 then d.name else '' end,
    a 是什么?colorder是什么?a.colorder=1又是什么意义?
    多谢!
      

  4.   

    access没系统表吧,你这个需求很难实现
      

  5.   

    这些Access里都没有的MsysXXX的表都没有权限问的
      

  6.   

    差点忘了用DataReader可以的到字段名和类型
      

  7.   


     using (OleDbConnection conn = new OleDbConnection("strConn"))
                {
                    conn.Open();
                    using (OleDbDataReader dr = new OleDbCommand("select * from tableName", conn).ExecuteReader())
                    {
                        for (int i = 0; i < dr.FieldCount; ++i)
                        {
                            dr.GetName(i);                      //字段名
                            dr.GetFieldType(i);                 //字段类型
                        }
                    }
                }
      

  8.   

    可是这样得到的字段类型是转换成C#类之后的类型,不是在数据库里时的类型啊,比如说Access里的“自动编号”读出来之后是“System.Int32”,而“备注”或“文本”读出来后应该都是“System.String”,这样读到的字段类型是无法操作数据库设计的啊
      

  9.   

    说到无法实现,但总之Mcrosoft Office Access自己是实现了的,所以肯定是有办法实现的。
      

  10.   

    我是在想能不能通过Schema来解决这个问题,不过自己Schema不熟。。
      

  11.   

                OleDbConnection conn = new OleDbConnection();
                conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Backup\我的文档\db1.mdb;";
                conn.Open();            OleDbDataReader odr = new OleDbCommand("select * from tablename ", conn).ExecuteReader();            DataTable dt = odr.GetSchemaTable();
                odr.Close();
                conn.Close();            DataGridView grid = new DataGridView();
                this.Controls.Add(grid);
                grid.Dock = DockStyle.Fill;
                grid.BringToFront();            grid.DataSource = dt;
                grid.Refresh();            conn.Close();///////////////////////
    ColumnName 字段名
    ProviderType Access中的字段类型,在access中建一个表然后对照一下。
    其他列的含义自己看看应该能明白的。
      

  12.   

                OleDbConnection conn = new OleDbConnection();
                conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Backup\我的文档\db1.mdb;";
                conn.Open();            OleDbDataReader odr = new OleDbCommand("select * from tablename ", conn).ExecuteReader();            DataTable dt = odr.GetSchemaTable();
                odr.Close();
                conn.Close();            DataGridView grid = new DataGridView();
                this.Controls.Add(grid);
                grid.Dock = DockStyle.Fill;
                grid.BringToFront();            grid.DataSource = dt;
                grid.Refresh();            conn.Close();/////////////////////////
    ColumnName 字段名
    ProviderType Access中的字段类型,在access中建一个表然后对照一下。
    其他列的含义自己看看应该能明白的。
    不是原创啊,以前收藏的,原作者记不得了。好象是个老外。
      

  13.   

                OleDbConnection conn = new OleDbConnection();
                conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Backup\我的文档\db1.mdb;";
                conn.Open();            OleDbDataReader odr = new OleDbCommand("select * from tablename ", conn).ExecuteReader();            DataTable dt = odr.GetSchemaTable();
                odr.Close();
                conn.Close();            DataGridView grid = new DataGridView();
                this.Controls.Add(grid);
                grid.Dock = DockStyle.Fill;
                grid.BringToFront();            grid.DataSource = dt;
                grid.Refresh();            conn.Close();/////////////////////////
    ColumnName 字段名
    ProviderType Access中的字段类型,在access中建一个表然后对照一下。
    其他列的含义自己看看应该能明白的。
    不是原创啊,以前收藏的,原作者记不得了。好象是个老外。
      

  14.   

    Access
      DataTable schemaTable = con.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new object[] { null, null, sTableName, null });
      表字段,类型等信息
      DataTable key_index = con.GetOleDbSchemaTable(OleDbSchemaGuid.Indexes, new object[] { null, null });
      表主键,索引信息
      

  15.   

    回十五楼,不错,你的代码很优化而且COLUMN_FLAGS和DATA_TYPE合起来除了备注和超链接分不清外其余的类型都分得清了,只要抛弃不常用的超链接,设计操作就都可行了~,OK,结贴。