0

我是新人,所以对我温柔:)

我创建了一些 C# 代码来读取 MS Access 文件的架构定义。它适用于大多数版本的 Access,但是当我尝试阅读旧版本的 Access (V1.X) 时,我收到以下错误:

外部数据源或使用以前版本的 Microsoft Jet 创建的数据库不支持此属性。

这是我的代码:

private DataTable ReadSchema(string strTable)
{

        DataTable schemaTable = new DataTable();
        try
        {
            OleDbConnection conn = new OleDbConnection("Provider= Microsoft.JET.OleDB.4.0;data source=R:\\CB Import\\CBS.MDB");

            conn.Open();
            OleDbCommand cmd = new OleDbCommand(strTable, conn);
            cmd.CommandType = CommandType.TableDirect;

            OleDbDataReader reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly);
            schemaTable = reader.GetSchemaTable();
            reader.Close();
            conn.Close();


            DataColumn dcRec = new DataColumn("TableName", typeof(string));
            dcRec.DefaultValue = strTable;
            schemaTable.Columns.Add(dcRec);


            schemaTable.Columns.Add("Type", typeof(string));
            schemaTable.Columns.Add("Length", typeof(string));




            foreach (DataRow r in schemaTable.Rows)
            {
                Console.WriteLine(r["ColumnName"].ToString() + " " + r["ColumnSize"].ToString() + " " + r["DataType"].ToString() + " " + r["NumericPrecision"].ToString() + " " + r["NumericScale"].ToString());
                r["Type"] = r["DataType"];
                r["Length"] = r["ColumnSize"];

                               }
        }

        catch (Exception e)
        {
        MessageBox.Show(e.Message);
        }

        return (schemaTable);


    }

它在这条线上爆炸:

OleDbDataReader reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly);

我的机器上安装了 Access 2010,即使我尝试在此版本的 Access 中打开这些旧的麻烦文件,我仍然会收到有关打开旧版本的错误。

除了我尝试阅读旧版本的 Access 时,此代码都可以正常工作。我可以通过使用 Access 2007(安装在另一台机器上)并将数据库文件保存为 2007 版本来解决它,但如果可能的话,我希望能够自动化(编码)这个?如果有另一种编码方式,或者我搞砸了,请告诉我。

任何帮助都将得到极大的欢迎,并用啤酒、巧克力、鲜花或任何漂浮在你船上的东西来回报:)

提前致谢。

4

1 回答 1

0

好的,这就是答案 - 我自己解决了。

 public DataTable ReadSchema(string strTable, string strConnectionString, string strAccessFileName)
    {
       DataTable schemaTable = new DataTable();
       schemaTable.Columns.Add("ColumnName", typeof(string));
       schemaTable.Columns.Add("ColumnSize", typeof(Int32));
       schemaTable.Columns.Add("NumericPrecision", typeof(Int32));
       schemaTable.Columns.Add("NumericScale", typeof(Int32));
       schemaTable.Columns.Add("DataType", typeof(string));
       schemaTable.Columns.Add("Length", typeof(string));

       try
       {

           using (var con = new OleDbConnection(strConnectionString))
           {
               con.Open();
               using (var cmd = new OleDbCommand("SELECT * FROM [" + strTable + "]", con))
               using (var reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly))
               {
                   var table = reader.GetSchemaTable();

                   foreach (DataRow row in table.Rows)
                   {
                       Console.WriteLine(row["ColumnName"].ToString() + " " + row["ColumnSize"].ToString() + " " + row["DataType"].ToString() + " " + row["NumericPrecision"].ToString() + " " + row["NumericScale"].ToString());

                       DataRow drRecord = schemaTable.NewRow();

                       drRecord["ColumnName"] = row["ColumnName"];
                       drRecord["ColumnSize"] = row["ColumnSize"];
                       drRecord["NumericPrecision"] = row["NumericPrecision"];
                       drRecord["NumericScale"] = row["NumericScale"];
                       drRecord["DataType"] = row["DataType"];

                       schemaTable.Rows.Add(drRecord); 
                   }
               }
           }
       }
       catch (Exception Ex)
       {

           string strMessage = "Selecting schema for table " + strTable + ". " + Environment.NewLine + Ex.Message;
           MessageBox.Show(strMessage, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
           tran.strErrors = tran.strErrors + strMessage + "\r\n";
           txtErrors.Text = txtErrors.Text + strMessage + "\r\n";
       }



        return (schemaTable);


    }

事实证明,糟糕的“OleDbCommand cmd = new OleDbCommand(strTable, conn);” 该行不适用于旧的 V1.X 数据库文件。所以用“SELECT”代替就可以了。

给我更多的啤酒!:)

于 2012-06-27T21:16:05.790 回答