【问题标题】:Determining if a field is a calculated field in MS Access确定字段是否为 MS Access 中的计算字段
【发布时间】:2016-02-10 23:45:10
【问题描述】:

我有一个 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 或false。我不确定如何确定这一点。从GetSchema 返回一个名为COLUMN_FLAGS 的列,其中可能包含我需要的信息。但是,我似乎找不到任何关于这些“标志”是什么的参考文档。

任何帮助将不胜感激!

【问题讨论】:

  • 这里的答案 (social.msdn.microsoft.com/Forums/en-US/…) 有帮助吗?我不是访问开发人员,但这是我偶然发现的。我的想法是,如果字段类型是“计算的”,那么你可以根据它设置你的布尔值。但是,我知道的不够多,无法作为答案发布。
  • @Tommy - 问题是,GetSchema 返回的 DATA_TYPE 没有返回 Calculated。它返回Integer,我计算出来的答案是一个整数,所以这是有道理的。但是,它并不能帮助我弄清楚它是真正计算出来的还是只是一个普通的整数字段。
  • 很公平 - 我想知道它是否会,但正如我所说,我无法快速测试并说是或否,因为 Access 并不是真正的“我的果酱”。顺便说一句,有趣的问题。

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


【解决方案1】:

我怀疑,如果您想要明确指示计算字段,则需要使用 Access DAO 并检查相关表的 TableDef 中 Field2 对象的 Expression 属性。例如:

// 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 对象并查看 OleDbDataReader.GetSchemaTable 方法返回的 DataTable。 OleDb 版本不包含IsExpression 列,但您可以通过查找IsReadOnly 为true 的列来推断“计算”状态。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 抱歉,OleDbDataReader#GetSchemaTable() 没有IsExpression 列,因此您的答案适用于 MS SQL Server,但不适用于 MS Access。
    猜你喜欢
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多