检查OleDb表中是否存在列

我正在尝试检查列是否存在,如果不存在,请添加它。 我尝试了几种解决方案,包括这个 ,但Access db的语法不正确。

这是我到目前为止:

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,但它没有返回正确的表格或其他东西。 我错过了什么?

要检查数据表中是否存在列,可以使用OleDbConnection的GetSchema方法

 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 } 

您使用GetOleDbSchemaTable的方法是GetOleDbSchemaTable的方法。 架构表的每一行都包含表的单个列的信息,架构表的每一列代表它的一个属性。 因此,循环遍历模式表的行,而不是列!

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

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