C# 按顺序访问查询字段
我的Access查询返回的字段顺序不正确。我的理解是,对于查询结果中的每一行,字段的顺序与查询的SELECT语句中指定的顺序相同。我做错了什么C# 按顺序访问查询字段,c#,.net-3.5,ms-access-2007,C#,.net 3.5,Ms Access 2007,我的Access查询返回的字段顺序不正确。我的理解是,对于查询结果中的每一行,字段的顺序与查询的SELECT语句中指定的顺序相同。我做错了什么 String query = "SELECT " + "bas.[BAS BACnet Object Type/Instance], " + "bas.[BAS BACnet Object Name], " + "bas
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);
}
您正在为每个字段的结果列表添加相同的引用类。我怀疑你想把Add调用放在循环之后
另外,您还没有显示什么是AVProperty.PROPERTY_ID,但是您需要确保查询的SELECT部分与之匹配。大概是一个枚举。。。因此,需要对应于bas的枚举值。[bas BACnet对象类型/实例]的值为0,以此类推
如果您能提供更多的相关代码,我们可能会为您提供更多帮助。我还强烈建议您仔细阅读您的代码,使您的名字更易于解释和习惯用语。NET不使用首字母大写作为名称
此外:
您没有对任何应该处理的对象使用语句
您正在忽略从GetValues返回的值。
如上所述,它们是按选定顺序排列的 您正在根据avClass.Properties的顺序在中读取它们。。。。 要使其工作,avXClass.Properties[3]必须位于您想要的位置[点列表说明] 这不是一个好主意,这会改变两端的顺序,如果你幸运的话,你的代码会立即失效。 某种映射可能会做到这一点,或者只是
AVClass.SetProperty[SomeKnownPropertyName]=reader.Fields[SomeKnownPieldName] 不是在“发件人”中,而是在查询的“选择”部分。是的,它们一定是按顺序排列的,没有例外。@Svarog:接得好!我修正了打字错误