我在哪里可以获得有关 ODBC 和 Access 数据库的高质量信息?
Posted
技术标签:
【中文标题】我在哪里可以获得有关 ODBC 和 Access 数据库的高质量信息?【英文标题】:Where can I obtain high quality information about ODBC & Access Databases? 【发布时间】:2012-01-02 17:43:09 【问题描述】:多年来,我使用 MFC/C++/Java 中的 ODBC 从事过各种项目。
目前,我有一个 C++/MFC 项目,它使用自定义 MFC 层动态连接到连接到 Access 2000 dbm 文件的 ODBC DSN。
这通常有效。
但是,我通常会收到以下警告:
DBMS:访问版本:04.00.0000 ODBC 驱动程序管理器版本: 03.80.0000 未实现可选功能状态:S1C00,本机:106,来源:[Microsoft][ODBC Microsoft Access 司机]
警告:驱动程序不支持请求的并发。选修的 功能未实现 状态:S1C00,本地:106,来源:[Microsoft][ODBC Microsoft Access 司机]
现在,当我们的软件尝试创建视图时,我得到以下信息:
一般警告无法打开注册表项 'Temporary (volatile) Jet 进程 0x18fc 线程 0xc0 DBC 0x8c4cfc Jet'的 DSN。 State:01000,Native:1,Origin:[Microsoft][ODBC Microsoft Access Driver]
DBMS:访问版本:04.00.0000 ODBC 驱动程序管理器版本: 03.80.0000 执行 SQL:创建视图 SPEC 作为选择 CALNAME 作为 TEST,CARDNUMBER,CARTONSTYLE 作为 CARTON,CCAL 作为 FLUTE,CORRDIR, CUSTOMERID,描述为 DESCRIPTIO,DESIGNER,DESIGNNUM,JOINTSIZE, JOINTTYPE,PANEL_D 作为 DEPTH,PANEL_L 作为 LENGTH,PANEL_W 作为 WIDTH, RULRULX 为 DSIZEX,RULRULY 为 DSIZEY,SHEETUX 为 SIZEX,SHEETUY 为 SIZEY, SHEETX as GROSSX, SHEETY as GROSSY from "Designs" where DESIGNNUM 不为空 警告:ODBC 成功信息,驱动程序 SQLSetConnectAttr 失败状态:IM006,本机:0,来源:[Microsoft][ODBC 司机经理]
一般警告无法打开注册表项 'Temporary (volatile) Jet 进程 0x18fc 线程 0xc0 DBC 0x8c4cfc Jet'的 DSN。 State:01000,Native:1,Origin:[Microsoft][ODBC Microsoft Access Driver]
对于第一部分,关于未实现可选功能和未实现并发状态的警告(可能是相同的潜在问题),我不知道我的软件甚至要求什么并发功能?哪些并发状态是合适的?一个人如何要求“正确”的?是否有要请求的 Windows 版本与适当并发状态的表格?
关于第二部分,关于由于无法打开注册表项导致创建视图失败的具体问题:嗯?!谁没有打开哪个注册表项?
我发现了一些关于需要给予IUSR 对“windows NT 临时文件夹”的完全权限的信息。对于桌面应用程序来说,这听起来像是一个需要关注的可怕问题。使用 ODBC DSN 的桌面应用程序在操作存在于用户可读/可写路径中的数据库文件时,应该如何关注用户权限?还需要哪些权限才能允许用户执行此 SQL?而既然用户已经能够在数据库中现有的表中添加和删除列和行,还需要做什么呢?
这段代码曾经在 XP 下工作。所以我不得不假设 Vista 和/或 Win 7 添加了一些现在阻止此功能的安全性。
我有兴趣:
-
来自 Microsoft 的规范参考材料,其中实际记录了它们的各种 ODBC Access 接口、选项、版本、主机问题等。
有关并发警告的具体信息。
有关尝试在 access 2000 dbm 中创建视图时明显权限失败的具体信息。
对上述设备进行现代化改造的建议,无需彻底检修或更换技术。即,我很乐意将 Access 文件更新到 2003 或 2007 或其他任何版本,或者可能将后端切换到 SQL Server Lite,但我不能证明从 ODBC 更改为某些替代中间件是合理的(这不值得花时间和风险)。
感谢您提供的任何想法或帮助。
【问题讨论】:
我没有原始问题的答案,但至于第 4 点。我已经完成了从 Access 到 SQL Server 的几次转换。过渡相当轻松,因为整个数据库模式将只进行非常小的修改。大多数应用程序 SQL 也很容易迁移到存储过程。 谢谢。我相信这应该是相当直截了当的。最大的问题是将 SQL Server lite 与我们的安装程序集成,仔细检查任何法律问题,并在我们的应用程序生成的 SQL 中实现所需的任何语法更改。这不是微不足道的,如果我毫无疑问地知道上述所有问题都将通过这样的改变得到解决,那么证明这一点会更容易。最后,需要为当前使用 Access 数据库的现有客户提供迁移机制,这会使事情变得非常复杂。叹。 :P 【参考方案1】:是的,远程客户端的迁移可能会很痛苦。我绝对不惜一切代价避免访问的部分原因。我已经做到了这两种方式之一。 1) 使用 WebEx(或其他一些在线会议程序)来控制远程机器,以确保迁移按需要进行。 2) 在新代码中构建一个检查以查看数据库是否已迁移。如果新数据库 (SQL Server) 显示为未找到,则应用程序将启动迁移工具。但是,这意味着构建和完善迁移实用程序和脚本以自动迁移,因为很多事情都可能出错。
我不久前开始做的一件事是在数据库中构建一个应用兼容性表。这样代码可以检查以确保数据库模式版本匹配。我还包括另一个表(加密),其中包含将数据库升级(迁移)到新版本所需的所有 SQL。这样,应用程序可以确定需要迁移数据库,并可以运行脚本来执行此操作。
我真的希望这会有所帮助。
【讨论】:
感谢您的反馈和想法。我还在围栏上。我在这个构建周期的预算中没有为迁移分配任何实时时间。这可能必须是付费选项...【参考方案2】:我们有一个动态使用 ODBC 访问数据库的应用程序。
Microsoft 有很好的关于 odbc 的文档 http://msdn.microsoft.com/en-us/library/s9ds2ktb(v=vs.80).aspx 您还应该查看 CRecordset 和 CDatabase 文档 http://msdn.microsoft.com/en-us/library/1hkkwdf0(v=vs.80).aspxhttp://msdn.microsoft.com/en-us/library/2dhc1abk(v=VS.80).aspx
对于并发问题,通常会在您打开带有错误选项的 CRecordset 时发生。在我工作的地方,我们通常使用以下选项打开记录集
-
RecordsetToUse.Open(CRecordset::dynaset, "SQL Statement or NULL to use the DefaultSQL", CRecordset::skipDeletedRecords);
如果使用记录集进行快速只读访问,也可以使用
RecordsetToUse.Open(CRecordset::forwardOnly, "SQL Statement or NULL to use the DefaultSQL", CRecordset::readOnly);
3 .对于创建视图问题,似乎 ODBC 不支持创建视图......另一方面,我认为您可以使用 ADODB(http://www.codeproject.com/KB/database/adoclasses .aspx) 来做到这一点
【讨论】:
是的,我认为这个问题与 ODBC/Jet 无关,尽管我之前担心过,我现在认为这是一个 MFC 问题(并且可能与我们用来打开的选项直接相关)数据库/记录集)。感谢以上,我会看看我们在做什么比较。我们的代码很旧,可能有一些来自 VC++ 6.0 的旧 MFC 垃圾或其他东西! 我们的软件使用 dynaset,这是唯一可以正常工作的软件。在进行只读查找时,可能可以显式使用 forwardOnly,但不值得为此付出努力。所有其他模式完全失败或以只读记录集结束。这些警告显示为 MFC 迭代方法的一部分,以找出它应该与当前驱动程序一起使用的并发性。它尝试一个,警告它失败,然后尝试另一个,直到它成功或耗尽所有可能性。这就是并发警告的来源。 我完全不清楚 Jet 关于注册表失败的投诉来自何处……也许是驱动程序本身。似乎很有可能。但它似乎并没有干扰......只是让它看起来有问题,而实际上没有。整个事情花了好几个小时才确定它运行正常,所有消息看起来都很普通。呸。 :( 注册表错误是发生在其他计算机上,还是只是您的开发机器上?以上是关于我在哪里可以获得有关 ODBC 和 Access 数据库的高质量信息?的主要内容,如果未能解决你的问题,请参考以下文章
我在哪里可以获得有关如何使用 Apollo 和 GraphQL 获取数据的文档?
无法通过 ODBC 将 Access 连接到 SQLlite
我在哪里可以获得有关与 Sage Mas 90 业务对象接口集成的文档?