我在移植到 Mono 的应用程序时遇到了一些问题。
(作为参考,.NET 运行时为 4.0,单声道版本为 2.6.7。)
编辑:这个问题在 Mono 2.10.2 上仍然存在
作为应用程序启动的一部分,它将数据读入内存。对于这一部分,我只是使用内联 SQL 命令,但由于某种原因,我在 Linux/Mono 上看到了不一致的行为(当整个事情在 Windows/.NET 中运行时)。
我有一个查询在某些情况下可以正常工作,但在其他情况下却不行。
这个特定的例子不起作用:
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' 替换 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)。