访问查询字段乱序
本文关键字:字段 查询 访问 | 更新日期: 2023-09-27 18:13:57
我的Access查询返回的字段顺序错误。我的理解是,对于查询结果中的每一行,字段的顺序与查询的SELECT
语句中指定的顺序相同。我做错了什么?
String query =
"SELECT " +
"bas.[BAS BACnet Object Type/Instance], " +
"bas.[BAS BACnet Object Name], " +
"bas.[BAS Point List Description], " +
"ore.[ORE Data Direction], " +
"ref.[ENUM_H], " +
"yk.[CCC Max Value (eng units)], " +
"yk.[CCC Min Value (eng units)], " +
"yk.[CCC Enum/Data Set], " +
"ore.[ORE COV Increment], " +
"ore.[ORE Display Precision] " +
"FROM (([OV2 BAS] AS bas " +
"INNER JOIN [OV2 ORE] AS ore ON bas.[Ref ID] = ore.[Ref ID]) " +
"INNER JOIN [OV2 RefID] AS ref ON bas.[Ref ID] = ref.[Ref ID]) " +
"INNER JOIN [YK CAPP] AS yk ON bas.[Ref ID] = yk.[Ref ID] " +
"WHERE bas.[BAS BACnet Object Type/Instance] <> '';";
try
{
cmd = new OleDbCommand(query, this._conn);
reader = cmd.ExecuteReader();
if (reader.HasRows == false)
{
Exception e = new Exception("Read of mapping table returned no results.");
throw e;
}
while (reader.Read() != false)
{
Int32 columns;
Object[] fields = new Object[10];
columns = reader.GetValues(fields);
avClass = new AVClass();
for (int i = 0; i < AVClass.AV_CLASS_PROPERTIES; i++)
{
avClass.Properties[i] = new AVProperty((AVProperty.PROPERTY_ID)i, fields[i]);
results.Add(avClass);
}
}
}
catch (Exception e)
{
Console.WriteLine("ERROR: " + e.Message);
Console.WriteLine(e.ToString());
}
目前尚不清楚这是否是仅的问题,但这对我来说似乎是错误的:
for (int i = 0; i < AVClass.AV_CLASS_PROPERTIES; i++)
{
avClass.Properties[i] = new AVProperty((AVProperty.PROPERTY_ID)i, fields[i]);
results.Add(avClass);
}
您为每个字段添加相同的引用(avClass
)到结果列表。我怀疑你想把Add
call 放在循环之后。
同样,您还没有显示AVProperty.PROPERTY_ID
是什么,但是您需要确保查询的SELECT部分与之匹配。大概是枚举吧……因此,您需要与"has"对应的enum值。[BAS BACnet对象类型/实例]"值为0等
:
- 你没有对任何应该被处置的对象使用
using
语句 - 您忽略了
GetValues
返回的值。
如上所述,它们按选择顺序排列。
你正在阅读他们基于avClass.Properties....的顺序为了这个工作avXClass。属性[3]必须在你想要的地方[点列表描述]
这不是一个好主意,这会改变两端的顺序,如果你幸运的话,你的代码会立即掉下来。某种类型的映射可以做到这一点,或者简单地
AVClass。SetProperty[SomeKnownPropertyName] = reader.Fields[SomeKnownFieldName];