确定字段是否为 MS Access 中的计算字段
Determining if a field is a calculated field in MS Access
我有一个 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
的列,其中可能包含我需要的信息。但是,我似乎找不到任何关于这些 "flags" 是什么的参考文档。
如有任何帮助,我们将不胜感激!
您需要使用 GetSchemaTable()
方法。您应该查找的 属性 是 IsExpression
。见 MSDN for SqlDataReader.GetschemaTable()
我怀疑如果您想要计算字段的明确指示,您将需要使用 Access DAO 并检查 Field2
对象的 Expression
属性 TableDef
代表有问题的 table。例如:
// 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
.
的列来推断 "calculated" 状态
我有一个 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
的列,其中可能包含我需要的信息。但是,我似乎找不到任何关于这些 "flags" 是什么的参考文档。
如有任何帮助,我们将不胜感激!
您需要使用 GetSchemaTable()
方法。您应该查找的 属性 是 IsExpression
。见 MSDN for SqlDataReader.GetschemaTable()
我怀疑如果您想要计算字段的明确指示,您将需要使用 Access DAO 并检查 Field2
对象的 Expression
属性 TableDef
代表有问题的 table。例如:
// 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
.