2012-01-11 16 views
5

Kod aracılığıyla bir MS Acess veritabanının (.mdb) şemasını değiştirmem gerekiyor. Jet Motor DDL ifadeleri yana ADO.NET kullanarak bir MS Access veritabanı şemasını değiştirmek mümkün mü?

(vb ALTER TABLE)

oldukça kötü ben yalnızca DAO ( myDatabase.TableDefs("myTable").Fields.Append(myNewField)) ya da ADOX ( myCatalog.Tables("myTable").Columns.Append(myNewField)) veya SMO (gibi nesne kitaplığına bir çeşit kullanmayı tercih ediyorum, belgelenir SQL Server için, benzer sözdizimi - fikri alırsınız).

ADO.NET için ADOX gibi bir şey var mı, yoksa DDL deyimlerini kullanarak mı yoksa eski DAO/ADOX kitaplıklarına başvurma mı yapıyorum?

+1

bunu [kötü belgelenmiş] olduğu ne anlama geliyor (http://msdn.microsoft.com/en-us/library/bb267262%28v=office.12%29.aspx)? Hangi açıklama size açık değil? Neyse, .NET'te ADOX kullanabilirsiniz. Örneğin, [ADOX ve Visual C# .NET] kullanarak bir Access veritabanı nasıl oluşturulur (http://support.microsoft.com/kb/317881). – RedFilter

+0

Bağlantı için teşekkürler, Access'in son sürümlerinde belgelerin büyük ölçüde iyileştirilmiş gibi görünüyor. Yine de, bir örnek: ALTER TABLE sayfası geçerli veri türleri listesi içermez; Tamamen belirsizdir (belgelerden), örneğin, X hassasiyeti ve Y ölçeği ile nasıl yeni bir ondalık oluşturabilirim? Bu arada, bu tip bir veri türü anahtar sözcüğü buldum (kullanıcı yorumları bölümünde bağlantılıdır). [CREATE TABLE belgelerinin] (http://msdn.microsoft.com/en-us/library/bb177893.aspx)), ancak bu, örneğin, SQL Server BOL kalitesinden çok uzaktır. – Heinzi

+2

Oh, ve Access şemalarını DDL aracılığıyla yönetmenin başka bir nedeni iyi bir fikir değildir: [Şema satır kümeleri bozuk.] (Http://social.msdn.microsoft.com/Forums/eu/adodotnetdataproviders/thread/58a17c99-0b23 -4341-a274-db2dd91e0886) Ne OLE DB şema tabloları ne de ODBC şema tabloları Access alanları için doğru IS_NULLABLE değerleri döndürdüğü zor yolu öğrendim. Bir erişim alanı null olduğunu kontrol etmek için * sadece * güvenilir bir yol gibi görünüyor ** DAO ** kullanmak ve 'myField.Required' için kontrol etmektir. Bu ne kadar acıklı? 2012 yılında bir .net projesine DAO referansı eklemek zorunda ... – Heinzi

cevap

1

Düz ddl ifadeleriyle iyi bir başarı elde ettim. Sizin hakkınızdaki sözdizimi, googlemeden vazgeçme isteğini gerektirse de, bir süredir bu şekilde yerel bir db'ye güncellemeler yapıyorum. Sorun yaşadığınız belirli bir güncelleme var mı? Temel olarak, bir tablonun yapısını kontrol etmek ve gerekirse alanları eklemek için birkaç yardımcı işlev yazdım.

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; 
    } 
İlgili konular