Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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# 处理从应用程序的多个实例到MS Access数据库的连接的最佳方法?_C#_Database_Winforms - Fatal编程技术网

C# 处理从应用程序的多个实例到MS Access数据库的连接的最佳方法?

C# 处理从应用程序的多个实例到MS Access数据库的连接的最佳方法?,c#,database,winforms,C#,Database,Winforms,我有一个连接到MS Access数据库的应用程序。在你说我应该放弃喷气式引擎之前,我可能会在将来这样做,事实上我希望我的应用程序能够在多个安装的引擎中进行选择。所以现在我希望我的应用程序尽可能不依赖引擎 我正在尝试实现一个新功能,它将允许我的应用程序的多个实例在同一台机器上运行,并且所有这些实例都连接到同一个数据库。但是我需要能够控制每次谁访问数据库。我不能让所有实例都从多个线程访问它,因为有些查询需要在一行中执行,例如插入一行,然后立即执行@@SELECT IDENTITY查询以获取刚刚生成的

我有一个连接到MS Access数据库的应用程序。在你说我应该放弃喷气式引擎之前,我可能会在将来这样做,事实上我希望我的应用程序能够在多个安装的引擎中进行选择。所以现在我希望我的应用程序尽可能不依赖引擎

我正在尝试实现一个新功能,它将允许我的应用程序的多个实例在同一台机器上运行,并且所有这些实例都连接到同一个数据库。但是我需要能够控制每次谁访问数据库。我不能让所有实例都从多个线程访问它,因为有些查询需要在一行中执行,例如插入一行,然后立即执行
@@SELECT IDENTITY
查询以获取刚刚生成的自动标识符

我不想让引擎处理这个问题,因为所有引擎在这方面都是不同的。我想到的第一件事是使用WCF和管道,编写我自己的小型数据库服务器,简单地围绕喷气发动机和数据库。然后使用
lock
s或
Mutex
es,以及一些
RequestExclusiveAccess
ReleaseExclusiveAccess
方法来控制谁可以随时访问数据库


现在我想只使用
互斥锁,不使用服务器就足够了,但我还是不确定。我在这里还遗漏了什么可能性吗?您认为实现这一点最有效的方法是什么?

除了访问和同步连接之外,实际上听起来您需要大量的作业填充作业队列,然后一个专用作业操作队列中的任何内容,并通知呼叫者他们的作业已完成(有结果)。然后,您可以避开由多个EXE进行的大量直接db访问。了解您在这里的最终目标会很有用。@dash:有道理,但我不确定如何处理这里的数据读取。有时需要读取许多行,我不能只等待读取所有行和填充数据集,而是需要使用
DataReader
读取每一行。至少到目前为止我一直是这样做的。这是一个网页抓取应用程序。它在网页中导航并在数据库中存储信息。因此,拥有多个应用程序实例将稍微提高性能。但请注意,在数据库中存储信息并不是我的应用程序的全部功能。它还对数据库执行自定义用户查询。因此,简单地说,它连接到数据库,并根据用户的意愿对其进行处理。实际上,DataReader不会在这里提供您想要的内容,因为它只会在查询完成后一次返回一行—这是一个很好的类,因为它避免了像dataset一样一次将大量数据加载到内存中。此外,您的底层数据库需要支持脏读等(基于表等的当前状态),而Access不支持脏读等。使用像SQL Server(或MySql,或…)这样的RDBMS意味着您可以使用事务性和表锁定功能来实现许多您想要的功能。但是,如果您想自己编写,那么实际上需要在数据库引擎周围编写一个包装器(如建议的那样),并且所有其他客户机都与此进行交互。您也可以像使用任何其他技术一样使用WCF,但您也可以在一个具有队列和几个工作线程的应用程序中实现这一点,这样就不那么复杂了。