问题
- ADO与OLE DB的关系如何?微软宣布放弃SQL Server的OLE DB提供程序意味着什么
- 这是否意味着,如果我们切换到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
- OLEDB
如果您确实放弃了旧的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驱动程序,却没有意识到你有这些微妙的"问题">,你的应用程序很快就会崩溃。