如何使用 C# 创建 Access 数据库并持续向其保存实时数据
本文关键字:保存 数据 实时 何使用 创建 Access 数据库 | 更新日期: 2023-09-27 18:32:49
我目前正在制作一个 24/7 全天候运行的应用程序,并不断从 OPC 服务器收集信息。
我现在需要做的是将此信息发送到数据库(.accdb文件(。这需要非常非常快地发生。我每毫秒从服务器获取一个新值,我需要以相同的速度将该值发送到数据库。最后,我每天在 00:00 将数据库压缩为.zip文件。
我一直在像疯子一样搜索网络,但我似乎找不到"最新"教程。到目前为止,我发现的每个人都使用">Microsoft.Jet.OLEDB.4.0"作为提供程序,但它在我的Windows 7 PC上不存在。
我已经制作了一个小应用程序来测试连接,我将在下面附加我当前的代码,以向您提示我到目前为止所尝试的内容,不过这些似乎都不起作用。
private void button1_Click(object sender, EventArgs e)
{
System.Reflection.Assembly oAssembly = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.Stream oStream = oAssembly.GetManifestResourceStream("RSLogixDB.accdb");
System.IO.FileStream fileStream = new System.IO.FileStream("C:''Users''sezettersth''Documents''RSLogixDB.accdb", System.IO.FileMode.Create);
byte[] abyt = new byte[oStream.Length];
oStream.Read(abyt, 0, (int)oStream.Length);
fileStream.Write(abyt, 0, (int)oStream.Length);
fileStream.Close();
if (fileStream != null)
{
fileStream.Close();
fileStream = null;
}
if (oStream != null)
{
oStream = null;
}
}
这是我尝试的第一种方法,这里我使用用于创建和写入文件的自制类。不幸的是,它不适用于.accdb文件。(第一行的评论包括我尝试过的提供程序。
private void button1_Click(object sender, EventArgs e)
{
//sFileDia.ShowDialog();
//Provider=Microsoft.ACE.OLEDB.12.0
//Povider=.NET Framework Data Provider for OLE DB
//Povider=Microsoft.Jet.OLEDB.4.0
//Driver={Microsoft Access Driver (*.mdb, *.accdb)};
//Data Source=C:''Users''sezettersth''Documents''RSLogixDB.accdb;
//Persist Security Info=False;
//Provider=Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:''Users''sezettersth''Documents''RSLogixDB.accdb;Persist Security Info=False
string RSLogixDB = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:''Users''sezettersth''Documents''RSLogixDB.accdb;Persist Security Info=False";
string RSLogixDBPath = "C:''Users''sezettersth''Documents''RSLogixDB.accdb";
OleDbConnection connection = new OleDbConnection(RSLogixDB);
string connectionStr = connection.ConnectionString;
//OleDbDataReader dataReader = new OleDbDataReader(RSLogixDB);
ImportExport textwriter = new ImportExport();
textwriter.setExportPath(RSLogixDBPath);
textwriter.endExport();
}
必须有一个简单的解决方案,如果没有">Microsoft.Jet.OLEDB.4.0"提供程序,我就不能是唯一一个使用 Access 的人。
(我还没有开始压缩文件的代码,如果您对如何做到这一点有想法,我很高兴听到它,但这里的主要重点是数据库问题。
更新:问题可能不在于提供程序,因为我最初,Microsoft.ACE.OLEDB.12.0允许我创建一个.accdb文件,但它只是一个空的txt文件,基本上有一个花哨的扩展名,它不能打开或与MS Access一起使用。如何制作工作.accdb文件?
关于你的代码
老实说,我对您在提供的代码示例中尝试实现的目标感到茫然。
据我所知,您只是在创建一个文件RSLogixDB.accdb
.
也许我错过了一些东西,但这根本不是您创建数据库的方式。
您是否查看并尝试了这些SO问题的答案中的代码:
- 如何在运行时使用 C# 创建访问数据库?
- 如何以编程方式在 C# 中创建Microsoft Access 数据库?
现在,再解释一下。
喷气机 vs ACE
首先,ACCDB文件格式是对现在称为ACE的Jet进行全面改造的结果。它仅与 Access 2007/2010 一起使用,并包含不向后兼容的新功能。
若要打开此类文件,必须安装 Access 2007/2010(或至少安装免费的 Access 运行时(或 Microsoft 中的特定 ACE 驱动程序。
关于 32/64 位
为了您的理智,无论您的操作系统位数如何,都只能使用 Office 和 Access 32 位。即使Microsoft也不建议使用 64 位版本,除非您将 Excel 推向极限。
- 不能混合使用 Office 32 位和 64 位应用程序
- 不能在同一台计算机上安装 32 位和 64 位 ACE 驱动程序
- 使用 ACE 驱动程序的版本 2007 或 2010,但避免同时安装两者。
- 确保编译 .Net 应用程序时与安装的 Access/ACE 驱动程序具有相同的位数(因此,如果您遵循上述建议,则应专门编译为 x86,而不是 AnyCPU!
性能
如果您保留一些规则,则可以使用 Access 数据库获得非常不错的性能:
-
如果可能,请将数据库与将写入数据库的应用程序保留在同一台计算机上(避免网络速度变慢(
-
如果应用程序是唯一使用数据库的应用程序,请以独占模式而不是共享模式打开数据库:
// Share Mode=16 - use if multiple users must have simultaneous access to the db string constr = @"Provider=Microsoft.ACE.OLEDB.12.0;Mode=16;Data Source=C:'...'RSLogixDB.accdb;user id=;password=;"; // Share Mode=12 - exclusive mode if only your app needs access to the db string constr = @"Provider=Microsoft.ACE.OLEDB.12.0;Mode=12;Data Source=C:'...'RSLogixDB.accdb;user id=;password=;";
-
在应用程序启动时打开与数据库的虚拟连接,并使其保持打开状态,直到不需要数据库(例如,压缩数据库或应用关闭时(。
这实际上是一个非常重要的性能改进:打开与 Access 数据库的新连接的成本很高,因为驱动程序需要创建/销毁/更新.accdl
锁定文件。
如果保持与数据库的始终打开的连接,则会大大加快对数据库的读/写速度。有关此主题的更多信息,请查看此文章:
OLE DB 连接池在哪里?
返回任务
我会做你想实现的方式:
-
使用 Access 手动创建一个简单的数据库
RSLogixDB.accdb
,其中包含将保存数据的表。
还要在其中创建一个数据很少或没有数据的dummy
表。我们将使用它来保持连接打开并避免锁定文件性能问题。 -
如果需要每天从头开始重新创建数据库,请将该原始数据库的副本保留为模板,然后复制该模板并用新的每日数据填充副本。
-
如果您是数据库的唯一用户,请在独占模式下打开它。
-
打开连接并从虚拟表中读取数据,但不要关闭它。保持打开状态。
-
全天将数据保存到数据表中
-
午夜时分,关闭数据库(关闭虚拟表(,确保锁定文件
.accdl
消失,然后压缩数据库。
如果需要从空数据库开始,请用模板替换数据库。
在压缩数据库之前,我还会压缩数据库以减小其大小。 -
如果 ADO.Net 数据访问的标准性能不足以满足您的情况,请查看使用本机 DAO 例程。查看此SO问题的答案:
在 .NET/C# 中将大量记录(大容量插入(写入 Access
如果需要连接字符串来连接到特定数据库,则应始终 http://www.connectionstrings.com/
对于 Access,您可能会发现此页面很有帮助:http://www.connectionstrings.com/access-2007
我为你找到了这个。 连接到 MS Access (Windows 7(
此外,此论坛主题将为您提供帮助。
谢谢
保罗。
我相信无法建立您的连接,因为 Jet OLEDB 驱动程序不是随 Windows 7 一起提供的,而是需要单独安装的。执行此操作的一种方法是安装 Microsoft Access,另一种方法是从Microsoft(MDAC = Microsoft 数据访问组件(中查找 MDAC 可再发行组件包。
您可以按照以下链接上的说明检查您是否拥有 - 如果是 - 您拥有哪个版本的 MDAC:
http://support.microsoft.com/kb/301202/en-us
至于现在(AUG22(,您可以在同一台PC上同时安装x32位和x64位OLEDB/ACE(/MS Access Database Microsoft.Jet.OLEDB.4.0和Microsoft.ACE.OLEDB.12.0(驱动程序:
我遵循了本文"在同一台计算机上使用具有32位和64位Altium设计软件的数据库库"中的设置说明,它们适用于带有MS Office x32的Win10 Professional x64 v.21H2(内部版本19044.1826(。
我将 x32 OLEDB 驱动程序与旧版 VS2019 .NET Framework 4.7.x 应用程序的解决方案一起使用,将 x64 ACE 驱动程序与(现代(VS2022 应用程序的解决方案一起使用。