CRecordset::snapshot 在 VS2012 中不再工作 - 有什么替代方法吗?

2023-11-25

显然,在 VS2012 中,SQL_CUR_USE_ODBC 已被弃用。 [更新:光标库似乎已从 VS2012 中完全删除]。

MFC 的 CDatabase 不再使用它(而它是 VS2010 和早期版本的 MFC 的默认值),而是使用 SQL_CUR_USE_DRIVER。

不幸的是,SQL_CUR_USE_DRIVER 不能与 Jet ODBC 驱动程序一起正常工作(我们正在与 Access 数据库交互)。该驱动程序最初声称支持位置操作(但不支持位置更新),但是当尝试实际查询数据库时,所有并发模型都会失败,直到 MFC 库下降到与数据库的只读交互(这不会发生)为我们飞行)。

问题

  • 这是 MS 迫使开发人员放弃基于 Jet 的数据源并迁移到 SQL Express(或类似数据源)的最新尝试吗?
  • 我们是否应该使用另一种方式通过 VS 2012 版本的 MFC/ODBC 与 Access 数据库进行交互?(1)

也可以看看:http://social.msdn.microsoft.com/Forums/kk/vcmfcatl/thread/acd84294-c2b5-4016-b4d9-8953f337f30c


更新:查看各个选项,似乎游标库已从VS2012的ODBC库中删除。再加上 Jet 无法正确支持位置更新 (2),这使得“快照”模式无法使用。只要基础表具有主键,它似乎就支持“动态集”。无键表与“动态集”模式不兼容(3)。所以 - 我可以坚持使用 VS 2010,或者我可以更改我的表以包含自动编号或类似的内容,以确保 pkey 可用,以便我可以对记录集使用动态集模式。


(1) 例如我们应该为 CRecordset 使用不同的开放类型吗?我们当前使用 CRecordset::snapshot。但我从来没有真正理解快照、动态、动态集的各种模式。一组快速的“尝试每个”未能为我们的访问数据库提供一个可工作的可更新界面......
(2) 它在最初查询时声称支持,但随后返回其先前声称支持的所有并发模式的错误
(3)“动态”也被淘汰了,因为 Jet 根本不支持它(从我的测试中可以看出)。


我找到了一个似乎有效的解决方案。我以与 VS 2012 完全相同的方式覆盖 OpenEx,因为我们需要它来调用 AllocConnect 的子版本,因为它在父版本中不是虚拟的。如前所述,我还覆盖了 AllocConnect。在 CDatabase 的派生版本中,尝试以下代码:

MyC数据库.h

BOOL OpenEx(LPCTSTR lpszConnectString, DWORD dwOptions = 0);
void AllocConnect(DWORD dwOptions);

MyC数据库.cpp

BOOL MyCDatabase::OpenEx(LPCTSTR lpszConnectString, DWORD dwOptions)
{
ENSURE_VALID(this);
ENSURE_ARG(lpszConnectString == NULL || AfxIsValidString(lpszConnectString));
ENSURE_ARG(!(dwOptions & noOdbcDialog && dwOptions & forceOdbcDialog));

// Exclusive access not supported.
ASSERT(!(dwOptions & openExclusive));

m_bUpdatable = !(dwOptions & openReadOnly);

TRY
{
    m_strConnect = lpszConnectString;

    DATA_BLOB connectBlob;
    connectBlob.pbData = (BYTE *)(LPCTSTR)m_strConnect;
    connectBlob.cbData = (DWORD)(AtlStrLen(m_strConnect) + 1) * sizeof(TCHAR);
    if (CryptProtectData(&connectBlob, NULL, NULL, NULL, NULL, 0, &m_blobConnect))
    {
        SecureZeroMemory((BYTE *)(LPCTSTR)m_strConnect, m_strConnect.GetLength() * sizeof(TCHAR));
        m_strConnect.Empty();
    }

    // Allocate the HDBC and make connection
    AllocConnect(dwOptions);
    if(!CDatabase::Connect(dwOptions))
        return FALSE;

    // Verify support for required functionality and cache info
    VerifyConnect();
    GetConnectInfo();
}
CATCH_ALL(e)
{
    Free();
    THROW_LAST();
}
END_CATCH_ALL

return TRUE;
}

void MyCDatabase::AllocConnect(DWORD dwOptions)
{
CDatabase::AllocConnect(dwOptions);

dwOptions = dwOptions | CDatabase::useCursorLib;

// Turn on cursor lib support
if (dwOptions & useCursorLib)
{
    ::SQLSetConnectAttr(m_hdbc, SQL_ATTR_ODBC_CURSORS, (SQLPOINTER)SQL_CUR_USE_ODBC, 0);
    // With cursor library added records immediately in result set
    m_bIncRecordCountOnAdd = TRUE;
}
}

请注意,您不想首先将 useCursorLab 传递给 OpenEx,您需要在 AllocConnect 的 hack 版本中覆盖它。

另请注意,这只是一个 hack,但它似乎有效。请测试您的所有代码以确保其按预期工作,但到目前为止它对我来说工作正常。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CRecordset::snapshot 在 VS2012 中不再工作 - 有什么替代方法吗? 的相关文章

  • 检查空参数的最佳方法(保护子句)

    例如 您通常不希望构造函数中的参数为空 因此看到类似的内容是很正常的 if someArg null throw new ArgumentNullException nameof someArg if otherArg null throw
  • MVC 重定向到没有控制器的视图

    希望应该是一个简单的 我创建了一个通用错误视图 当整个站点的操作方法内发生异常时 我想显示该视图 我创建了一个部分页面 所有导航都位于其中 因此我不需要在此视图上使用控制器 那么如何从控制器内的操作方法重定向到它 像这样的东西 HttpPo
  • C修改printf()输出到文件

    有没有办法修改printf为了将字符串输出到文件而不是控制台 我尝试在互联网上查找一些内容 发现了类似的电话dup dup2 and fflush这可能与此有关 EDIT 也许我不清楚 问题是这是C考试问题 问题如下 解释一个通常将字符串输
  • 切换图片框可见性 C#

    为什么图片框控件的可见性属性在这里不起作用 我最初将它们设置为 false 以便在屏幕加载时它们不可见 但后来我想切换这个 我已完成以下操作 但似乎不起作用 这是一个 Windows 窗体应用程序 private void Action w
  • 如何将字节块读入结构体

    我有一个需要处理的资源文件 它包含一组文件 首先 资源文件列出了其中包含的所有文件 以及一些其他数据 例如在此结构中 struct FileEntry byte Value1 char Filename 12 byte Value2 byt
  • rand() 播种与 time() 问题

    我很难弄清楚如何使用 rand 并使用 Xcode 用 time 为其播种 我想生成 0 到 1 之间的随机十进制数 该代码为我提供了元素 1 和 2 看似随机的数字 但元素 0 始终在 0 077 左右 有什么想法吗 我的代码是 incl
  • C 中的模仿函数重写

    具体来说 函数重写能够调用基本重写方法 这有两部分 一个是预编译的库代码 1 另一个是库的用户代码 2 我在这里实现了一个尽可能最小的经典 Person 和 Employee 示例 非常感谢了解 OOP 概念的铁杆 C 开发人员的回应 我正
  • 使用反射获取基类的受保护属性值

    I would like to know if it is possible to access the value of the ConfigurationId property which is located in the base
  • 如何使用泛型类型的 DataContractSerializer 编写自定义序列化器?

    我想编写一个自定义序列化器 用于将会话状态存储到Azure 缓存 预览版 这意味着这个自定义序列化器必须实现IDataCacheObjectSerializer 如果我错了 请告诉我 我需要编写这个自定义序列化程序的原因是我需要序列化一些包
  • Microsoft.Graph - 如何从具有不同用户名的共享邮箱发送?

    我目前正在将使用 SMTP 的服务代码移植到 Office 365 通过 SMTP 我可以使用 发件人 字段在来自共享收件箱的邮件上设置不同的用户名 同时保留共享电子邮箱地址 这似乎无法通过 Office 365 运行 其工艺流程为 客户填
  • 如何不在类中实现接口的功能?

    面试时面试官问了我以下问题 但我不知道这个问题的答案是什么 请帮忙 如果我不想 我必须做什么 在我的类中实现一个函数 在接口中声明为 由我班实施 Edited 我正在使用 NET 和 C 如果有人可以提供 C 示例代码示例 那就太好了 Th
  • 如何将字符串转换为 Indian Money 格式?

    我正在尝试将字符串转换为印度货币格式 例如如果输入为 1234567 则输出应为 12 34 567 我编写了以下代码 但它没有给出预期的输出 CultureInfo hindi new CultureInfo hi IN string t
  • realloc():重新分配为 char * 上的 strcat 腾出空间时下一个大小无效 [重复]

    这个问题在这里已经有答案了 我在以下代码中收到无效内存错误 printf s n FINE 5 printf s LENGTH IS d n FINE 6 strlen buffer char realloc buffer strlen b
  • 当在 Repository/UnitOrWork 之上使用 Service 类时,我应该在哪里放置逻辑不适合 Repository 的常用数据访问代码?

    In my 先前的问题 https stackoverflow com questions 24906548 using the generic repository unit of work pattern in large projec
  • 无法通过 LINQ to Entities 使用某些功能?

    我正在尝试使用 LINQ 查询在项目上实现搜索功能 由于数据有时包含带有重音符号和其他符号的字符 因此我创建了一种方法来删除这些字符以进行搜索 这是我的代码 var addresses from a in db Addresses join
  • 在 .NET 中记录 StackOverflowException

    最近 我的 NET 应用程序 asp net 网站 中出现了堆栈溢出异常 我之所以知道该异常是因为它出现在我的 EventLog 中 我知道 StackOverflow 异常无法被捕获或处理 但是有没有办法在它杀死您的应用程序之前记录它 我
  • 将 bignum 类型结构转换为人类可读字符串的有效方法是什么?

    我有一点问题 为了增长我的 C 知识 我决定尝试实现一个基本的 bigint 库 bigint 结构的核心将是一个 32 位整数数组 选择它们是因为它们适合寄存器 这将允许我在数字之间进行操作 这些操作将在 64 位整数中溢出 这也将适合寄
  • 如何将 CSV 文件读入 .NET 数据表

    如何将 CSV 文件加载到System Data DataTable 根据CSV文件创建数据表 常规 ADO net 功能是否允许这样做 我一直在使用OleDb提供者 但是 如果您正在读取具有数值的行 但希望将它们视为文本 则会出现问题 但
  • 将一个 long 转换为两个 int 以进行重构

    我需要将一个参数作为两个 int 参数传递给 Telerik Report 因为它不能接受长参数 将 long 拆分为两个 int 并在不丢失数据的情况下重建它的最简单方法是什么 使用掩蔽和移位是最好的选择 根据文档 long 保证为 64
  • 如何确定给定方法可以抛出哪些异常?

    我的问题和这个真的一样 找出 C 中方法可能抛出的异常 https stackoverflow com questions 264747 finding out what exceptions a method might throw in

随机推荐

  • Shift-Tab 在 Emacs 中产生神秘错误

    我正在尝试学习org mode当我退出 emacs 时 注意到我的文件被整齐地折叠起来 按下时S TAB在尝试展开整个文件时 我在迷你缓冲区中收到以下错误消息 M z is undefined 谷歌搜索错误没有帮助 知道打嗝发生在哪里以及如
  • jstree 类型插件不显示自定义图标

    我有一个简单的 HTML 布局 如下所示 div ul li a href some category 1 a ul li a href some text a li ul ul li a href some text a li ul li
  • 在多个子图上反映事件处理

    我正在尝试创建一个包含 4 个子图的交互式图 理想情况下 单击其中一个子图将在其余子图中产生相同的结果 镜像单击 到目前为止 我只能单独单击它们并使用 mpldatacursor 获取特定数据 在此图中 单击事件将导致所有 4 个图表显示
  • 使用 Toolkit 时 Windows Phone 7 页面转换非常慢

    我遇到的问题是 每当我使用 Windows Phone 7 Toolkit 中的页面转换时 转换速度非常慢 并且整个应用程序似乎有框架掉落 动画 结结巴巴 还有其他人遇到过这种情况吗 我正在使用TransitionFrame类作为 Root
  • django 过滤器 icontains 仅匹配整个单词

    我正在使用过滤器 icontains 来搜索单词 但我只希望它匹配整个单词 例如如果我寻找肝脏 我不希望它返回 我的查询看起来像这样 MyModel objects filter title icontains search word 我见
  • 如何动态创建可在父作用域中访问的函数?

    这是一个例子 function ChildF Creating new function dynamically DynFEx function DynF Hello DynF Invoke Expression DynFEx Callin
  • 计算运输箱尺寸的粗略估计

    我正在尝试找到计算运输所需的箱子尺寸的最佳方法 我有 3 个不同尺寸的集装箱 我在数据库中定义了产品的宽度 长度 深度和质量 我想知道如何找到需要运输的最小箱子数量 以及考虑到购物车中的物品数量 这些箱子的最小尺寸 我当前的 想法 是找到整
  • 常数的哪一个性质使其不可改变?

    今天我面临一次面试 其中有一个问题对我来说非常棘手 面试官说 如何让常数能够改变它的值 我回答 使用指针 并向他展示了一个例子 int main void const int a 3 int ptr ptr int a printf A d
  • PHP、Postgres 帮助使用 RETURNING

    我想我了解 PostgreSQL 和 RETURNING 的工作原理 我找到了很多很多资源 如果我明白的话 它会看起来像 INSERT INTO table column2 column3 VALUES value1 value2 RETU
  • 如何在 Windows 上设置 cmake CXX 变量

    我收到以下错误 正在使用 Microsoft Windows 版本 6 1 7601 ErrorS CMake Warning at CMakeLists txt 4 project To use the NMake generator c
  • Android:打开活动而不保存到堆栈中

    我有 2 个活动 主要活动和列表活动 从 Main 你可以打开 List 从列表中您可以打开Main 我希望列表的每次打开都能如此not被保存到 历史 中 所以 从 Main 返回cannot返回列表 是否可以 当开始你的清单时Activi
  • libc.so.6 在 Linux 内核中的相关性 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我的问题是Linux内核是否包含libc so 6 经过谷歌搜索并浏览不同的链接后 我们发现libc so 6 不是 Linux 内核的一部分 因为内核在内核空间中为自己的使用而实现
  • JUnit 测试类未显示在 JMeter 中

    我正在尝试使用 JMeter 2 7 运行 JUnit 测试 但是 当在 JUnit 采样器的下拉列表中选择测试类时 它们不会显示 据我发现 这是因为测试类是从另一个类扩展的 AbstractJUnit4SpringContextTests
  • String 中的 Java Date 对象无法正常工作

    我遇到了一个似乎无法解决的顽固问题 我在 stackoverflow 上寻找解决方案 并找到了很多关于 Java 日期格式化的帖子 但没有具体针对我遇到的问题 基本上 我需要将日期字符串转换为 java util Date 对象 我正在使用
  • mongoDB中字符串字段值长度

    该字段的数据类型是String 我想获取字段名称字符长度大于 40 的数据 我尝试了这些查询但返回错误 1 db usercollection find where this name length gt 40 limit 2 output
  • 使用 Core Data 检索唯一结果集

    我有一个基于核心数据的应用程序 用于管理一堆实体 我希望能够执行以下操作 我有一个实体 SomeEntity 其属性为 名称 类型 等级 foo1 foo2 现在 如果我们严格按照 SQL 术语来讲 SomeEntity 有几行 我想要完成
  • ?android:attr/selectableItemBackground 与另一个现有背景

    我有一个 9patch 设置为布局的背景 但是我仍然想通过使用提供触摸反馈selectableItemBackground attr 我尝试过使用
  • 如何使用 bash 或 jq 检查 json 是否为空?

    我有一个函数可以检查 json 文件内的对象中保存的重复值 当发现重复项时 该函数返回如下内容 Basket1 Apple Orange Basket2 Apple Orange 如果没有找到重复项 则返回空列表 目前我正在使用 s在 ba
  • Perl 调试器可以将 ReadLine 历史记录保存到文件中吗?

    我暂时停止使用 lib ReadLine 和 lib Perl Readline 然而 Perl 调试器拒绝保存会话命令行历史记录 因此 每次调用调试器时 我都会丢失以前的所有历史记录 有谁知道如何让 Perl 调试器保存并希望附加类似于
  • CRecordset::snapshot 在 VS2012 中不再工作 - 有什么替代方法吗?

    显然 在 VS2012 中 SQL CUR USE ODBC 已被弃用 更新 光标库似乎已从 VS2012 中完全删除 MFC 的 CDatabase 不再使用它 而它是 VS2010 和早期版本的 MFC 的默认值 而是使用 SQL CU