确定如果一个字段是MS Access中的计算字段

问题描述:

我有一个Access 2013数据库,我试图用C#连接到它并获取有关数据库中的字段的信息。除了我不确定的一件事情是如何确定一个字段是否是一个计算字段之外,一切正在工作。这是我访问数据库架构:确定如果一个字段是MS 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财产,如果它的计算结果应该是truefalse。我不知道如何确定这一点。有一列从GetSchema返回,名为COLUMN_FLAGS,可能有我需要的信息。但是,我似乎无法找到有关这些“标志”的参考文档。

任何帮助,将不胜感激!

+1

请问这里的答案(https://social.msdn.microsoft.com/Forums/en-US/c8d7b3a6-cd99-4a45-a90b-66bfd6142b35/get-column-name-and-data-types-of-访问表?论坛= adodotnetdataproviders)帮助呢?我不是一个访问开发者,但这是我偶然发现的。我的想法是,如果字段类型是“计算”,那么你可以设置你的布尔基于此。但是,我不知道如何回复。 – Tommy

+0

@Tommy - 问题是,'GetSchema'返回的DATA_TYPE没有返回'Calculated'。它返回'Integer',我的计算答案是一个整数,所以这是有道理的。然而,它并没有帮助我弄清楚它是真正的计算还是只是一个普通的整数字段。 – Icemanind

+0

够公平 - 我想知道是否会,但正如我所说,我无法快速测试,并说是或否,因为访问不是真的“我的果酱”。有趣的问题btw。 – Tommy

我怀疑,如果你想有一个计算字段的明确指示,则需要使用Access DAO和检查Field2对象的Expression财产的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对象,并期待在由OleDbDataReader.GetSchemaTable方法返回的DataTable。 OleDb版本不包含IsExpression列,但您可以通过查找IsReadOnlytrue的列来推断“计算”状态。

你会想要使用GetSchemaTable()方法。您应该寻找的物业是IsExpression。见MSDN for SqlDataReader.GetschemaTable()

+1

对不起,但'OleDbDataReader#GetSchemaTable()'没有'IsExpression'列,所以你的答案适用于MS SQL Server,但不适用于MS Access。 –