0

私は新しいので、私に優しくしてください:)

MS Accessファイルのスキーマ定義を読み取るためのC#コードをいくつか作成しました。ほとんどのバージョンのAccessでうまく機能しますが、古いバージョンのAccess(V1.X)を読み込もうとすると、次のエラーが発生します。

このプロパティは、外部データソース、または以前のバージョンのMicrosoftJetで作成されたデータベースではサポートされていません。

これが私のコードです:

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);

マシンにAccess2010をインストールしていますが、このバージョンの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);


    }

悪い「OleDbCommandcmd=new OleDbCommand(strTable、conn);」であることが判明しました。lineは古いV1.Xデータベースファイルには適していません。したがって、「SELECT」に置き換えるとうまくいきます。

私のためにもっとビール!:)

于 2012-06-27T21:16:05.790 に答える