2012-01-11 5 views
5

MS Accessデータベース(.mdb)のスキーマをコードで変更する必要があります。ADO.NETを使用してMS Accessデータベーススキーマを変更することはできますか?

JetエンジンのDDLステートメント(ALTER TABLEなど)は文書化されていないため、DAO(myDatabase.TableDefs("myTable").Fields.Append(myNewField))やADOX(myCatalog.Tables("myTable").Columns.Append(myNewField))やSMOなどのオブジェクトライブラリを使用することをお勧めしますSQL Serverの場合、構文は似ています - あなたはアイデアを得る)。

ADOXのようなADOXのようなものがありますか、DDLステートメントの使用や古いDAO/ADOXライブラリの参照がありますか?

+1

あなたはそれが(http://msdn.microsoft.com/en-us/library/bb267262%28v=office.12%29.aspx)[悪い文書化]は何を意味するのですか?どのステートメントがあなたには分かりませんか?とにかく、あなたは.NETでADOXを使うことができます。たとえば、[ADOXとVisual C#.NETを使用してAccessデータベースを作成する方法](http://support.microsoft.com/kb/317881)を参照してください。 – RedFilter

+0

リンクをありがとうございます。最新バージョンのAccessでドキュメントが大幅に改善されたようです。それでも、ALTER TABLEページには有効なデータ型のリストが含まれていません。 (例えば、ドキュメントから)完全にはっきりしていません。例えば、精度Xと位取りYの新しい小数点をどのように作成するのですか?その間、私はデータ型キーワードのテーブルを見つけました(ユーザーコメントセクション[CREATE TABLEのドキュメント](http://msdn.microsoft.com/en-us/library/bb177893.aspx)を参照してください)、これは、たとえばSQL Server BOLの品質とは大きく異なります。 – Heinzi

+2

ああ、DDL経由でAccessスキーマを管理するもう1つの理由は良い考えではありません。[スキーマの行セットが壊れている](http://social.msdn.microsoft.com/Forums/eu/adodotnetdataproviders/thread/58a17c99-0b23 -4341-a274-db2dd91e0886)OLE DBスキーマ・テーブルもODBCスキーマ・テーブルも、Accessフィールドの正しいIS_NULLABLE値を返さないという難しい方法を学びました。 Accessフィールドがnullableであるかどうかをチェックする唯一の確実な方法は、** DAO **を使用し、 'myField.Required'をチェックすることです。それはどれほど哀れですか? 2012年に.netプロジェクトへのDAO参照を追加する必要があります。 – Heinzi

答えて

1

私はまっすぐなddlステートメントでまともな成功を収めました。あなたの文法では、グーグル・グーグルを驚かせる必要がありますが、私はしばらくこの方法でローカル・データベースの更新を処理していました。問題が発生している特定のアップデートはありますか? 基本的には、テーブルの構造をチェックし、必要に応じてフィールドを追加するためのヘルパー関数をいくつか書きました。

public bool doesFieldExist(string table, string field) 
    { 
     bool ret = false; 
     try 
     { 
      if (!openRouteCon()) 
      { 
       throw new Exception("Could not open Route DB"); 
      } 
      DataTable tb = new DataTable(); 
      string sql = "select top 1 * from " + table; 
      OleDbDataAdapter da = new OleDbDataAdapter(sql, routedbcon); 
      da.Fill(tb); 
      if (tb.Columns.IndexOf(field) > -1) 
      { 
       ret = true; 
      } 

      tb.Dispose(); 


     } 
     catch (Exception ex) 
     { 
      log.Debug("Check for field:" + table + "." + field + ex.Message); 
     } 

     return ret; 
    } 


    public bool checkAndAddColumn(string t, string f, string typ, string def = null) 
    { 

     // Update RouteMeta if needed. 
     if (!doesFieldExist(t, f)) 
     { 
      string sql; 
      if (def == null) 
      { 
       sql = String.Format("ALTER TABLE {0} ADD COLUMN {1} {2} ", t, f, typ); 
      } 
      else 
      { 
       sql = String.Format("ALTER TABLE {0} ADD COLUMN {1} {2} DEFAULT {3} ", t, f, typ, def); 
      } 
      try 
      { 
       if (openRouteCon()) 
       { 
        OleDbCommand cmd = new OleDbCommand(sql, routedbcon); 
        cmd.ExecuteNonQuery(); 
        string msg = "Modified :" + t + " added col " + f; 
        log.Info(msg); 
        if (def != null) 
        { 
         try 
         { 
          cmd.CommandText = String.Format("update {0} set {1} = {2}", t, f, def); 
          cmd.ExecuteNonQuery(); 
         } 
         catch (Exception e) 
         { 
          log.Error("Could not update column to new default" + t + "-" + f + "-" + e.Message); 
         } 

        } 
        return true; 
       } 
      } 
      catch (Exception ex) 
      { 
       log.Error("Could not alter RouteDB:" + t + " adding col " + f + "-" + ex.Message); 
      } 

     } 
     else 
     { 
      return true; 

     } 
     return false; 
    } 
関連する問題