ADO与OLE DB的关系如何



问题

  1. ADO与OLE DB的关系如何?微软宣布放弃SQL Server的OLE DB提供程序意味着什么
  2. 这是否意味着,如果我们切换到ADO,它将无法与SQL Server 2014一起工作,而且永远不会

微软宣布弃用SQL Server Native客户端OLE DB访问接口,并且SQL Server 2012是最新版本以支持提供程序。

上下文

我们是德尔福商店。我们使用的是Delphi 7和BDE,希望从BDE迁移,也可能迁移到Delphi XE2或更新版本。我们选择的DBMS是Microsoft SQL Server。我们考虑转移到ADO,但在上述公告的背景下,我们担心它的未来性。

这种关系的想法可以吗?:

Delphi <---> ADO <---> OLE DB <---> DBMS

我是否正确理解Microsoft想要迁移到?:

Delphi <---> ADO <---> OLE DB-bridge-ODBC <---> ODBC <---> DBMS

他们的意思是,他们将不再创建SQL Server Native Client OLEDB Provider。有许多OLE DB提供程序可用于访问SQL Server:

  • 用于SQL Server的Microsoft OLE DB提供程序(SQLOLEDB(

    这是SQL Server 2000时代的OLEDB提供程序,随操作系统本身一起提供。

  • SQL Native Client 9.0 OLE DB访问接口(SQLNCLI(

    • SQL Server 2005附带
    • 必须手动安装在客户端电脑上
    • 可以连接到SQL Server 7、2000和2005
    • 可以连接到SQL Server 2008,但他们建议您使用新的本机客户端
  • SQL Server Native Client 10.0 OLE DB Provider(SQLNCLI10(

    • SQL Server 2008附带
    • 必须手动安装在客户端电脑上
    • 可以连接到SQL Server 2000、2005、2008和2008 R2
  • SQL Server Native Client 11.0 OLE DB Provider(SQLNCLI11(

    • SQL Server 2012附带
    • 必须手动安装在客户端电脑上
    • 可以连接到SQL Server 2005、2008、2008 R2和2012
    • 如果用于连接SQL Server 2000,将引发错误

Microsoft将停止创建新的SQL Server Native ClientOLEDB提供程序。他们一直在创建:

  • SQL本机客户端OLE DB访问接口
  • SQL本机客户端ODBC提供程序

他们将停止创建OLEDB提供程序驱动程序,同时继续发布ODBC驱动程序。同时,原始的SQLOLEDB驱动程序仍然存在(即使在Windows10中(。您可以继续使用ADO访问SQL Server。ADO是OLDDB的友好包装器(也是API的笨拙野兽(。

在OLE DB中,您仍然可以使用旧的SQLOLEDBOLEDB驱动程序。

您还可以使用包装ODBC驱动程序(MSDASQL(的OLE DB提供程序:

  • ADO
    • OLEDB
      • SQLOLEDB:用于SQL Server的Microsoft OLE DB提供程序
      • SQLNCLI:SQL Native Client 9.0 OLE DB Provider
      • SQLNCLI10:SQL Server Native Client 10.0 OLE DB Provider
      • SQLNCLI11:SQL Server Native client 11.0 OLE DB Provider
      • MSDASQL:Microsoft OLE DB Provider for ODBC Drivers
        • {SQL Server}:SQLSRV32.dll
        • {SQL Server本机客户端10.0}:sqlncli10.dll
        • {SQL Server本机客户端11.0}:sqlncli11.dll

如果您确实放弃了旧的SQLOLEDB提供程序,转而使用ODBC驱动程序,那么您必须小心一个微妙的问题:

SQL Server不支持在一个连接上打开多个记录集。例如,如果你有某种主细节:

sql := 'SELECT * FROM Orders';
qry := DatabaseHelper.Execute(sql);
while not qry.EOF do
begin
   //...
   //Oh, this order needs to be frobbed.
   DatabaseHelper.ExecuteNoRecords('UPDATE ORDERS SET Frob=1 WHERE OrderID='+IntToStr(orderID));
   qry.Next;
end;

您刚刚尝试在记录集仍在迭代的连接上执行第二件事。SQL Server不支持此功能。幸运的是,OLEDB提供商知道这一点,并将静默地为您打开第二个连接(一个新的spid和所有东西(来执行操作。

ODBC驱动程序没有这样的帮助。如果你转而使用ODBC驱动程序,却没有意识到你有这些微妙的"问题">,你的应用程序很快就会崩溃。

相关内容

最新更新