问题:如何获取access2007的所有表名和表结构
其实要这些信息无非是想弄一个代码生成器.可是由于对access2007只限于"会用",所以不清除内部的原理.从网上找了一些代码,都要用到msysObjects这个系统表.但是在access2007中默认是不允许访问这个表的.不知道如何设置才可以用代码访问系统表.知道的兄弟们最好些的详细一些.贴图说明最好^^.
当然如果有其它的方式获得所有表名和表结构也行.
最好是C#代码,特别声明:一定是access2007,且如果需要设置系统表访问权限的一定要写详细一些如何进行设置.

解决方案 »

  1.   

    http://www.cnblogs.com/sxlfybb/articles/448072.html
    转来的,没试过~
      

  2.   

    http://topic.csdn.net/t/20050325/11/3880126.html
      

  3.   

    1.所有表
    OleDbConnection conn = new OleDbConnection(accpath);
    conn.Open();
    DataTable dt = conn.GetSchema("Tables");
                for(int i=0;i<dt.Rows.Count;i++)
                {
                    if(dt.Rows[i].ItemArray[3].ToString()=="TABLE")
                    Console.Writeln(dt.Rows[i].ItemArray[2].ToString());
                } 2.遍历dt
    用select * from tablename where 1=0提取DataSet
    注意要sda.FillSchema(ds);
    从ds.Tables[0].Columns[]集合里提取数据库结构。
      

  4.   

    OPENSCHEMA、ADOX的TABLES均可得到 
      

  5.   

    上面 的方法可以获取表名和表的column的部分信息。但是如何获取表的说明和字段说明呢?
      

  6.   

    http://blog.csdn.net/sqlove/archive/2008/10/15/3081456.aspx
      

  7.   

    哎,上面没一个正确的。困扰很久了,把我找到的答案贴出来吧
    特别声明:我没找到通过设置access2007系统表的方式来获得想要的数据//获取表信息
    using (OleDbConnection v_Con = new OleDbConnection())
    {
        v_Con.ConnectionString = "access2007连接字符串";
        v_Con.Open();
        //获取所有用户自定义数据表
        DataTable v_dt = v_Con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
    }//获取表中字段的信息,假如存在一个名为:StudentInfo的基础数据表
    using (OleDbConnection v_Con = new OleDbConnection())
    {
        v_Con.ConnectionString = "access2007连接字符串";
        v_Con.Open();
        DataTable v_dt = v_Con.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new object[] { null, null, "StudentInfo", null });
        //将查询到的数据按照字段在表中的顺序排序
        dt.DefaultView.Sort = "ordinal_position asc";
        DataView v_dvColumn = v_dt.DefaultView;
    }上面的代码可以获取到表和字段的说明。下面是Access中Data_type的说名,代码是摘自别人的博客,只是把VB的改成了C#代码switch (data_type)
    {
        //case常量 值 说明
        //case 0x2000
        //   :p = AdArray     //(不适用于 ADOX。) 0x2000      一个标志值,通常与另一个数据类型常量组合,指示该数据类型的数组。
        case 20: 
            p = "adBigInt   20 指示一个八字节的有符号整数 (DBTYPE_I8)。";
        case 128: 
            p = "adBinary   128 指示一个二进制值 (DBTYPE_BYTES)。";
        case 11: 
            p = "adBoolean  指示一个布尔值 (DBTYPE_BOOL)。";
        case 8: 
            p = "adBSTR  8 指示以 Null 终止的字符串 (Unicode) (DBTYPE_BSTR)。";
        case 136: 
            p = "adChapter  136 指示一个四字节的子集值,标识子行集合中的行 (DBTYPE_HCHAPTER)。";
        case 129: 
            p = "adChar129 指示一个字符串值 (DBTYPE_STR)。";
        case 6: 
            p = "adCurrency 6 指示一个货币值 (DBTYPE_CY)。货币是一个定点数字,小数点右侧有四位数字。该值存储为八字节、范围为 10,000 的有符号整数。";
        case 7: 
            p = "adDate 7 指示日期值 (DBTYPE_DATE)。日期保存为双精度数,数字的整数部分是从 1899 年 12 月 30 日算起的天数,小数部分是一天当中的片段时间。";
        case 133: 
            p = "adDBDate 133 指示日期值 (yyyymmdd) (DBTYPE_DBDATE)。";
        case 134: 
            p = "adDBTime 134 指示时间值 (hhmmss) (DBTYPE_DBTIME)。";
        case 135: 
            p = "adDBTimeStamp 135 指示日期/时间戳(yyyymmddhhmmss 加十亿分之一的小数)(DBTYPE_DBTIMESTAMP)。";
        case 14: 
            p = "adDecimal 14 指示具有固定精度和范围的确切数字值 (DBTYPE_DECIMAL)。";
        case 5: 
            p = "adDouble 5 指示一个双精度浮点值 (DBTYPE_R8)。";
        case 0: 
            p = "adEmpty 0 指定没有值 (DBTYPE_EMPTY)。";
        case 10: 
            p = "adError 10 指示一个 32 位的错误代码 (DBTYPE_ERROR)。";
        case 64: 
            p = "adFileTime 64 指示一个 64 位的值,表示从 1601 年 1 月 1 日开始的 100 个十亿分之一秒间隔的数量 (DBTYPE_FILETIME)。";
        case 72: 
            p = "adGUID 72 指示全局唯一标识符 (GUID) (DBTYPE_GUID)。";
        case 9: 
            p = "adIDispatch 9 指示指向 COM 对象上 IDispatch 接口的指针 (DBTYPE_IDISPATCH)。";
        //注意   ADO 目前不支持这种数据类型。使用它可能导致不可预料的结果。
        case 3: 
            p = " adInteger 3 指示一个四字节的有符号整数 (DBTYPE_I4)。";
        case 13: 
            p = "adIUnknown  13 指示指向 COM 对象上 IUnknown 接口的指针 (DBTYPE_IUNKNOWN)。"; 
        //注意   ADO 目前不支持这种数据类型。使用它可能导致不可预料的结果。
        case 205: 
            p = "adLongVarBinary 205 指示一个长二进制值(仅限于 Parameter 对象)。";
        case 201: 
            p = " adLongVarChar 201 指示一个长字符串值(仅限于 Parameter 对象)。";
        case 203:         p = "adLongVarWChar 203 指示一个以 Null 终止的长 Unicode 字符串值(仅限于 Parameter 对象)。";
        case 131: 
            p = "adNumeric 131 指示具有固定精度和范围的确切数字值 (DBTYPE_NUMERIC)。";
        case 138: 
            p = "adPropVariant 138 指示一个 Automation PROPVARIANT (DBTYPE_PROP_VARIANT)。";
        case 4: 
            p = "adSingle 4 指示一个单精度浮点值 (DBTYPE_R4)。";
        case 2: 
            p = "adSmallInt 2 指示一个双字节的有符号整数 (DBTYPE_I2)。";
        case 16: 
            p = "adTinyInt 16 指示一个单字节的有符号整数 (DBTYPE_I1)。";
        case 21: 
            p = " adUnsignedBigInt 21 指示一个八字节的无符号整数 (DBTYPE_UI8)。";
        case 19: 
            p = "adUnsignedInt 19 指示一个四字节的无符号整数 (DBTYPE_UI4)。";
        case 18: 
            p = "adUnsignedSmallInt 18 指示一个双字节的无符号整数 (DBTYPE_UI2)。";
        case 17: 
            p = "adUnsignedTinyInt 17 指示一个单字节的无符号整数 (DBTYPE_UI1)。";
        case 132: 
            p = "adUserDefined 132 指示一个用户定义的变量 (DBTYPE_UDT)。";
        case 204: 
            p = "adVarBinary 204 指示一个二进制值(仅限于 Parameter 对象)。";
        case 200: 
            p = "adVarChar 200 指示一个字符串值(仅限于 Parameter 对象)。";
        case 12: 
            p = "adVariant 12 指示一个 Automation Variant (DBTYPE_VARIANT)。"; //注意   ADO 目前不支持这种数据类型。使用它可能导致不可预料的结果。
        case 139: 
            p = "adVarNumeric 139 指示一个数字值(仅限于 Parameter 对象)。";
        case 202: 
            p = "adVarWChar 202 指示一个以 Null 终止的 Unicode 字符串(仅限于 Parameter 对象)。";
        case 130: 
            p = "adWChar 130 指示一个以 Null 终止的 Unicode 字符串 (DBTYPE_WSTR)。";
    }