none
Jetデータベースを作成する RRS feed

  • 質問

  • VC++6.0とDAOで作成していたアプリをC#2005とADO.NETで作り直しています。
    DAOでは

    CDaoDatabase::Create
    でmdbファイルを作成し、
    CDaoTableDef::Create
    でテーブルを作成し、
    CDaoTableDef::CreateField
    でフィールドの作成が出来ました。
    ADO.NETでも同様のことをしたいのですが、方法が見つかりません。
    どなたか助言をお願い致します。

     

    2007年9月10日 4:32

すべての返信

  • VBですが、以下が参考になると思います。

     

    ADOXで作成したデータベースのテーブルの値要求について
    http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=1643534&SiteID=7

    2007年9月10日 5:22
    モデレータ
  • 兼田さん、こんにちは。

     兼田 さんからの引用

    VC++6.0とDAOで作成していたアプリをC#2005とADO.NETで作り直しています。


    ADO.NETでも同様のことをしたいのですが、方法が見つかりません。
    どなたか助言をお願い致します。


    ADO.NET であれば、System.Data.OleDb.OleDbCommand クラスなどから SQL 文を発行しましょう。

    2007年9月10日 5:22
  • 助言ありがとうございます。
    確かに、ADOXを使えば出来そうなのですが、VBとVC++のサンプルしかなく、
    C#での使用方法が分からず苦戦しています。
    ADOXはADOの拡張機能のようですが、ADO.NETにはADOXのような拡張
    機能はないのでしょうか。

     

    2007年9月12日 4:24
  • OleDbCommand クラスで SQL 文を発行するのは最初に考えたのですが、データベースがすでに存在していて開かれていないとSQL文を発行出来ないような気がします。
    ということで、そもそも最初にデータベースを作るところで行き詰まっています。

    2007年9月12日 4:35
  • 「ADOX C#」で検索すれば、サンプルはたくさん見つかります。

    ADO.NETでは残念ながらmdbを作成することはできないと思います。私が知っている範囲では、ADOXかDAOを使う例しか見たことがありません。

    2007年9月12日 6:25
    モデレータ
  •  兼田 さんからの引用

    ということで、そもそも最初にデータベースを作るところで行き詰まっています。

     

    .mdb ファイルが存在していれば、接続してテーブルを作ることは可能なので、「空の .mdb ファイル」を用意しておいて、それをコピーするんじゃ駄目なんでしょうか?

     

    2007年9月12日 15:17
    モデレータ
  •  trapemiya さんからの引用

    「ADOX C#」で検索すれば、サンプルはたくさん見つかります。


    ご指摘ありがとうございます。

    確かにいっぱいいサンプルが見つかりました。

    ただし、帯に短し襷に長しで、だいぶ悩みましたが、何とか次のようなコードが出来ました。
    try-catch がいっぱい出てくるのは、すでにテーブル等が存在する場合にもエラーにならないようにするためです。

    column.ParentCatalog や column.Type をなぜ設定しなければいけないのかなど、疑問点は多々あるのですが、取りあえず問題なく動いています。

    ありがとうございました。

    ADOX.CatalogClass catalog = new ADOX.CatalogClass();

    if (データベースがない場合){

      catalog.Create ("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\\Data\\PointData.mdb");
    }

    else {
      catalog.let_ActiveConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\\Data\\PointData.mdb");

    }

    ADOX.Table table = new ADOX.Table();
    foreach (ADOX.Table tb in catalog.Tables) {
    if (tb.Name == "PointData") {
      table = tb;
      break;
    }
    if (table.Name != "PointData") {
      table.Name = "PointData";
      catalog.Tables.Append((object)table);
    }
    ADOX.ColumnClass column = new ADOX.ColumnClass();

    try {
      column.ParentCatalog = catalog;
      column.Name = "Number";
      column.Type = ADOX.DataTypeEnum.adInteger;
      column.Properties["AutoIncrement"].Value = true;
      table.Columns.Append(column, ADOX.DataTypeEnum.adInteger, 8);
    }
    catch {
    }
    column = null;
    try {
      table.Keys.Append("PrimaryKey", ADOX.KeyTypeEnum.adKeyPrimary, "Number", "", "");
    }
    catch {
    }

    2007年9月13日 5:07
  • Marshal.ReleaseComObject() しているところが見当たりませんが、大丈夫ですか?

     

    2007年9月14日 18:22
    モデレータ