c# – Mono是否将System.Data.SqlCommands与.NET区别对待?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – Mono是否将System.Data.SqlCommands与.NET区别对待?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3163字,纯文字阅读大概需要5分钟。
内容图文
![c# – Mono是否将System.Data.SqlCommands与.NET区别对待?](/upload/InfoBanner/zyjiaocheng/905/bf916662271d4dd6bc5605caf46e98b7.jpg)
我在使用我们移植到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"));
}
我可能怀疑存在以下差异:
> Casing(因为我知道这在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 |新).
解决方法:
好伙伴我设法重现你的问题.你有一个线程问题.这是我唯一的想法,可能是这个问题的原因,我设法实际重现它.
为了解决这个问题,您需要执行以下操作:
>确保每个读者在解析后都有一个reader.Close()调用
数据.
>使用以下代码执行线程安全调用:
Object executeLock = new Object();
private IDataReader ExecuteThreadSafe(IDbCommand sqlCommand)
{
lock (executeLock)
{
return sqlCommand.ExecuteReader(CommandBehavior.CloseConnection);
}
}
看起来mono具有与.NET不同的SQL对象实现.确实,我无法在Windows上重现它!
内容总结
以上是互联网集市为您收集整理的c# – Mono是否将System.Data.SqlCommands与.NET区别对待?全部内容,希望文章能够帮你解决c# – Mono是否将System.Data.SqlCommands与.NET区别对待?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。