Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OLEDB连接上的System.AccessViolationException。使用Dapper查询_C#_.net_Vb.net_Oledb_Dapper - Fatal编程技术网

C# OLEDB连接上的System.AccessViolationException。使用Dapper查询

C# OLEDB连接上的System.AccessViolationException。使用Dapper查询,c#,.net,vb.net,oledb,dapper,C#,.net,Vb.net,Oledb,Dapper,我正在使用.Net 4.0中的OleDbConnection查询带有ACE OleDb 12.0引擎的Microsoft Access 2010数据库。进程每秒可能执行大量查询,因为我有大约60个可能的并行线程(我在读取后为TPL设置了ThreadPool限制)。mdb文件位于网络驱动器上。我使用以下代码在每个查询上创建和处理连接: Using connection As New OleDb.OleDbConnection(connectionString) result = conne

我正在使用.Net 4.0中的
OleDbConnection
查询带有ACE OleDb 12.0引擎的Microsoft Access 2010数据库。进程每秒可能执行大量查询,因为我有大约60个可能的并行线程(我在读取后为TPL设置了
ThreadPool
限制)。mdb文件位于网络驱动器上。我使用以下代码在每个查询上创建和处理连接:

Using connection As New OleDb.OleDbConnection(connectionString)
    result = connection.Query(Of Foo)(query, New With {.Param1 = param1, .Param2 = param2}).FirstOrDefault()
End Using
有时,在调用
connection.Query
时,我会在System.Data.dll中看到
System.AccessViolationException。这个异常应该由非托管代码引发,但我不直接使用非托管代码,所以它发生在调用
Query
之后。我还想确保这不是一个明显与多线程相关的问题,但是,如果我正确理解了文档,那么每个查询使用一个
IDbConnection
应该是线程安全的,Dapper也应该是线程安全的

错误并不总是发生在同一个查询或POCO类型上,这可能不是硬件的问题(CPU<50%,内存<75%,我的进程占用的内存不超过250 MB)。我还没有看到SQL Server的
SqlConnection
上的类似代码出现问题

此外,我正在使用VS Express 2012,因此即使我配置了“异常中断”,我也无法使用异常助手进行故障排除。我显然不想在堆栈中捕获异常,因为它是一个与内存相关的异常(因为我不想捕获OutOfMemoryException)


我做错什么了吗?有没有办法调试它,因为它只是偶尔发生?这可能是Dapper或OleDb引擎的错误吗?

我怀疑问题在于多个线程访问Access DB。据我所知,
MS-Access
不是为
多线程应用程序设计的,因为它对并发性有限制

关于它的文档并不多,但它提到MS Access不是为高压力和高并发性而设计的

编辑:基于评论

  • 您可以将access数据库直接转储到SQL Server中,作为一个暂存过程,然后针对暂存表中的数据运行.Net代码,并将其放入SQL上的最终表中
  • 使用,可能对.Net代码使用脚本任务
  • 我看到过一个处理2gb CSV文件的过程,使用缓冲区来传输数据。因此,如果可以将ms access数据转储到CSV中,则可以在内存中运行类似的过程

  • 我在其他地方发现(在我的历史记录中找不到)Access应该支持多达255个并发连接,我在问题中提到的限制是每个进程64个连接。虽然我知道Access不一定适合我的需要(事实上,问题出现在从Access到新SQL Server数据库的数据迁移作业中),但我不明白为什么它不能处理几十个只读连接。“我可以尝试降低线程的最大数量,但我永远无法确定。”BenjaminBeaulieu,我记得几年前使用Access开发小型web应用程序时,有很多用户可以降低它。您是否正在使用TPL迁移数据?您不能导出到CSV,然后使用SSIS将数据加载到SQL吗?我们使用.Net重新验证、转换(格式和结构)并将数据从Access迁移到SQL Server。我不认为有一个集所有功能于一身的工具可以让我们像使用自定义.Net代码那样深入。性能也非常重要,因为我们每天只有一个很小的时间窗口来迁移所有数据。我已经用一些替代解决方案更新了答案。MS Access DB的CSV转储会有多大?我考虑过使用您的第一个解决方案(将访问转储到SQL Server,然后从SQL Server进行查询),但Access中的迁移助手抛出错误,无法完成迁移(完全不同的问题)。即使成功了,迁移也应该能够每天自动运行,因此使用助手并不是一个真正的选项。显然,使用.Net代码将数据从Access迁移到SQL Server中的暂存区域可能会导致我现在遇到同样的问题。