我正在处理一个我们正在移植到Mono的应用程序的问题。(参考文献:.NET运行时是4.0,而mono版本是2.6.7。)作为应用程序启动的一部分,它会将数据读入内存。对于这部分,我只是使用内联SQL命令,但由于某种原因,在Linux/Mono上看到了不一致的行为(当整个过程在Windows/.NET上工作时)。我有一个查询在某些情况下能够正常工作,但在其他情况下则不能。以下是一个特定的示例,其无法正常工作:
建议返回结果集中没有“column1”。
(编辑:为了更清晰,更新了此部分)
奇怪的是,如果我这样做:
输出结果为:
我猜这个问题可能与Mono框架有关,但我找不到相关的错误报告,并且我无法确定为什么在某些情况下会发生这种情况而在其他情况下不会!是否有其他人有过类似的经验?
编辑:我已经更改了一些语句以精确匹配失败查询中的语句,以防保留字或类似问题。请注意,我在第二个案例中发出的查询确实请求四列,并且似乎只返回两个非常奇怪的值(0 | New)。
var cmd = new SqlCommand("SELECT ID, Name, VATTerritoryID, NativeCurrencyID FROM PricingZones", conn);
var reader = cmd.ExecuteReader();
var objectToLoad = new SomeObjectType();
while (reader.Read())
{
objectToLoad.Property1 = reader.GetInt32(row.GetOrdinal("ID"));
objectToLoad.Property2 = reader.GetString(row.GetOrdinal("Name"));
objectToLoad.Property3 = reader.GetInt32(row.GetOrdinal("VATTerritoryID"));
objectToLoad.Property3 = reader.GetInt32(row.GetOrdinal("NativeCurrencyID"));
}
编辑说明:作为比较,下面有一个有效的示例:
var cmd = new SqlCommand("SELECT VATTerritoryID, ProductDescriptionID, VATBandID FROM VATTerritoryBandExceptions", conn);
var reader = cmd.ExecuteReader();
var someOtherObjectToLoad = new SomeOtherObjectType();
while (reader.Read())
{
someOtherObjectToLoad.Property1 = reader.GetInt32(row.GetOrdinal("VATTerritoryID"));
someOtherObjectToLoad.Property2 = reader.GetString(row.GetOrdinal("ProductDescriptionID"));
someOtherObjectToLoad.Property3 = reader.GetInt32(row.GetOrdinal("VATBandID"));
}
我怀疑可能存在以下差异:
- 大小写(因为我知道Windows/Linux上不同),但将所有内容转换为小写并没有解决问题
- 列名(也许Mono更关心保留字?),但似乎用[Name]或'Name'替换名称并没有任何区别
在第一种情况下出现的错误是:
[IndexOutOfRangeException: Array index is out of range.]
at System.Data.SqlClient.SqlDataReader.GetInt32(Int32 i)
建议返回结果集中没有“column1”。
(编辑:为了更清晰,更新了此部分)
奇怪的是,如果我这样做:
var cmd = new SqlCommand("SELECT ID, Name, VATTerritoryID, NativeCurrencyID FROM PricingZones", conn);
var reader = cmd.ExecuteReader();
var objectToLoad = new SomeObjectType();
while (reader.Read())
{
Console.WriteLine("First row, first column is " + row.GetValue(0));
Console.WriteLine("First row, second column is " + row.GetValue(1));
Console.WriteLine("First row, third column is " + row.GetValue(2));
Console.WriteLine("First row, fourth column is " + row.GetValue(3));
}
输出结果为:
First row, first column is 0
First row, second column is New
Array index is out of range.
我猜这个问题可能与Mono框架有关,但我找不到相关的错误报告,并且我无法确定为什么在某些情况下会发生这种情况而在其他情况下不会!是否有其他人有过类似的经验?
编辑:我已经更改了一些语句以精确匹配失败查询中的语句,以防保留字或类似问题。请注意,我在第二个案例中发出的查询确实请求四列,并且似乎只返回两个非常奇怪的值(0 | New)。
(Int32)reader["column1"]
会怎样? - Mike Christensenrow.GetOrdinal("column ")
-- 这不是导致问题的原因吧? - LukeH