2012-08-27 211 views
2

我想檢查一列是否存在,如果不存在,添加它。我已經嘗試了幾個解決方案,包括this,但是對Access數據庫的語法不正確。檢查OleDb表中是否存在列

這是我到目前爲止有:

public void Update(string task, string dbPath, string tableName = "Frames") 
    { 
     OleDbConnection db = new OleDbConnection("Provider=Microsoft.JET.OLEDB.4.0;data source=" + dbPath); 
     db.Open(); 

     OleDbCommand command = db.CreateCommand(); 
     command.CommandText = "COL_LENGTH('Frames','SetNumber')"; 
     Debug.WriteLine(command.ExecuteReader()); 




     /* 
     string[] restrictions = new string[] {null, null, tableName}; 

     DataTable dtColumns = db.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, restrictions); 

     foreach (DataColumn column in dtColumns.Columns) 
     { 
      Debug.WriteLine(column.ColumnName); 
     }*/ 

    } 

我也:使用GetOleDbSchemaTable嘗試,但它沒有返回右表什麼的。 我錯過了什麼?

回答

5

要檢查一列數據表中的存在,您可以使用的OleDbConnection

public void Update(string task, string dbPath, string colName, string tableName = "Frames") 
{ 
    using(OleDbConnection db = new OleDbConnection("........")) 
    { 
     db.Open(); 
     var schema = db.GetSchema("COLUMNS"); 
     var col = schema.Select("TABLE_NAME='" + tableName + 
        " AND COLUMN_NAME='" + colName + "'" 

     if(col.Length > 0) 
      // Column exist 
     else 
      // Column doesn't exist 
} 
+0

接受的方法的getSchema這是因爲長的作品比在這種情況下返回所有列名更好。謝謝! – pdizz

2

您的方法與GetOleDbSchemaTable是要走的路。模式表的每一行都包含您表的單個列的信息,模式表的每一列代表它的一個屬性。因此,循環遍歷模式表的行,而不是列!

foreach (DataRow row in dtColumns.Rows) { // <== dtColumns.Rows 
              //  (NOT dtColumns.Columns) 
    string columnName = (string)row["COLUMN_NAME"]; 
    .... 
} 

您的方法會生成模式表本身的列名。