确定字段是否是MS Access中的计算字段

时间:2016-02-10 23:45:10

标签: c# ms-access oledb ms-access-2013 oledbconnection

我有一个Access 2013数据库,我正在尝试使用C#连接它,并获取有关数据库中字段的信息。一切都在工作,除了一件我不确定的事情是如何确定一个字段是否是一个计算字段。这是我的Access数据库架构:

.---------------------------------------------------.
| TestTable1                                        |
|---------------------------------------------------|
| Field Name      | Data Type | Comments            |
|---------------------------------------------------|
| ID              | AutoNumber| Primary Key         |
| Field1ShortText | Short Text|                     |
| Field2LongText  | Long Text |                     |
| Field3Calculated| Calculated| Formula = 1+2       |
.---------------------------------------------------.

这是我的C#代码:

using (var connection = new OleDbConnection(ConnectionString))
{
    connection.Open();

    using (DataTable columns = connect.GetSchema("Columns"))
    {
        foreach (DataRow row in columns.Rows)
        {
            if (((string)row["TABLE_NAME"]).ToLower() != tableName.ToLower())
                continue;

            var field = new Field();
            field.FieldName = (string) row["COLUMN_NAME"];
            field.IsCalculated = ? // Here is where I'm stuck
        }
    }
}

我正在遍历Access数据库中的所有列,并且我正在设置一个名为IsCalculated的属性。这是bool属性,如果计算出true,则应为falseGetSchema。我不知道如何确定这一点。有一个名为COLUMN_FLAGS的{​​{1}}返回的列,可能包含我需要的信息。但是,我似乎无法找到关于这些“标志”的参考文献。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

我怀疑如果你想要一个计算字段的明确指示,你需要使用Access DAO并检查表float lat = ... float lon = ... String addr = URLEncoder.encode("my address", "UTF-8"); java.net.URI( "geo", "" + lat + "," + lon + "?q=" + addr, null); Expression对象的Field2属性有问题。例如:

TableDef

或者,正如另一个答案所示,您可以创建一个// This code requires the following COM reference in your project: // // Microsoft Office 14.0 Access Database Engine Object Library // // and the declaration // // using Microsoft.Office.Interop.Access.Dao; // // at the top of the class file var dbe = new DBEngine(); Database db = dbe.OpenDatabase(@"C:\Users\Public\Database1.accdb"); foreach (Field2 fld in db.TableDefs["TestTable1"].Fields) { if (fld.Expression.Length > 0) { Console.WriteLine("Field [{0}] is calculated.", fld.Name); } } db.Close(); 对象,并查看OleDbDataReader.GetSchemaTable方法返回的OleDbDataReader。 OleDb版本不包含DataTable列,但您可以通过查找IsExpressionIsReadOnly的列来推断“已计算”状态。

答案 1 :(得分:0)

您需要使用GetSchemaTable()方法。您应该寻找的属性是IsExpression。请参阅MSDN for SqlDataReader.GetschemaTable()