前一段时间我问过question关于哪种本地数据库适合我的情况。我需要从.NET代码和VB6访问数据库。压倒性的反应是SQLite。但是,我决定传递SQLite,因为它唯一的OLE DB提供商为我的软件的每个部署副本收取版税。它还需要在每台PC上运行激活程序。
在评估了其他选项(SQL Server Compact版本 - 几乎不起作用的OLE DB提供程序,Firebird - 不想为另一个驱动程序付费等等)之后,我得出的结论是唯一可行的选择正在使用由Microsoft Access(或Jet引擎)创建的.MDB文件。
自90年代末以来我没有使用它,所以我对那些有相关经验的人提出以下问题。
感谢。
答案 0 :(得分:7)
而不是“返回”Access,我坚持使用SQLite并使用System.Data.SQLite提供程序在.NET代码中进行SQLite数据访问。
然后我将创建一个简单的COM互操作.NET类供VB6使用,它包含任何所需的SQLite数据访问功能。最后,只需引用并使用它就像VB6项目中的标准COM对象一样。
我对Access的了解可能有些过时且有不良经历的偏见,但在合理的范围内,我会在使用Access路线之前尝试其他大多数选项。
答案 1 :(得分:5)
您是否考虑过SQL Server 2008 Express Edition(与SQL Server CE相反)?
1)就个人而言,我发现大多数时候访问数据库损坏了它是由于代码在自身之后没有清理,或者涉及到有错误的网卡。
2)
string connectionString = @“Provider = Microsoft.Jet.OLEDB.4.0; " +
@"Data Source = C:\data\northwind.mdb; " +
@"User Id = guest; Password = abc123”
using (OleDbConnection oleDbConnection = New OleDbConnection())
{
oleDbConnection.ConnectionString = connectionString;
oleDbConnection.Open();
...
}
3)SQL Server 2008 Express Edition
答案 2 :(得分:4)
MDB损坏主要是由于数据库打开时客户端计算机,文件服务器和网络中发生的故障。如果您将MDB放在文件共享上,那么这始终是一种风险,如果在本地硬盘驱动器上并且由一个用户使用,则问题会更加罕见。
我不希望SQLite有任何不同,如果更糟的话。
定期运行JetComp.exe(Microsoft下载)将修复许多问题并压缩索引表等。无论您使用什么,备份都很重要。
您根本不需要MS Access来使用Jet MDB。有一些第三方工具可用于设计数据库模式和执行交互式查询,包括命令行和GUI。
答案 3 :(得分:2)
由于MDB格式或多或少已被弃用,因此您90年代后期的知识是最新的。 See this MSDN page
答案 4 :(得分:1)
您还可以尝试SQL Anywhere它在各种操作系统上运行,占用空间小。适合我:)
答案 5 :(得分:1)
愤怒的黑客问:
Q1。他们是否经常解决数据库腐败的问题。
呃,什么?在正确维护的环境中正确部署的正确设计的应用程序中从未出现任何损坏问题。我在3到4年内没有看到过损坏的MDB,而且我在许多不同类型的操作环境中有许多客户全天候使用我的应用程序。
我认为大多数遭遇腐败的人都是那些试图在许多用户之间共享MDB文件的人(无论是拆分还是非拆分)。由于您没有考虑使用Access,因此这不是一个问题。
Q2。是通过ADO.NET OLEDB Provider从c#访问MDB还是有本机解决方案(我似乎无法找到它)。
原生解决方案是DAO,但那是COM,所以你可能不想使用它。从C#开始,我认为OLEDB是你最好的选择,但这不是我的专业领域,所以请耐心等待。我相信Michael Kaplan报告Jet ADO / OLEDB提供商是线程安全的,而DAO则不是。这并不意味着他推荐ADO / OLEDB而不是DAO,但他的评论也出现在Access上下文中,而不是C#。
Q3。是否有可行的替代方案来访问真正糟糕的SQL编辑器?
当您实际上没有使用Access时,为什么要使用它?您可以使用任何您喜欢的SQL编辑器,只要您测试您编写的SQL与Jet的SQL方言兼容。
我,其中一个,看不出Access的SQL编辑器有什么问题(除了无法设置字体大小),但是,我用QBE编写了很多我的SQL并且从来没有甚至看看SQL视图。
答案 6 :(得分:1)
回答你关于Access中真正糟糕的SQL编辑器的问题 - 我完全同意。字体很糟糕,MSAccess总是严重地重新格式化查询,它有时会添加破坏我的SQL的元字符,最后但是最糟糕的是,如果它无法解析SQL,它将不允许您访问它!
我的解决方案是使用外部代码。我使用DAO实例化MSAccess,然后可以使用QueryDefs集合直接编辑查询。它允许您执行大多数操作 - 创建,重命名,编辑等。但有一些事情您无法通过这种方式执行 - 例如,您无权访问查询元数据(描述,隐藏等)。
外部代码也很棒,因为您可以构建一组测试用例,指定预期的返回值等等。