Strange Thing:如果在连接字符串中使用SQLOLEDB而不是ODBC,则会出错

时间:2014-09-26 11:46:58

标签: sql-server-2008 asp-classic odbc connection-string oledb

背景

我们的经典ASP&基于SQL Server的应用程序与ODBC连接字符串完美配合。

然而,在最近的Windows更新后,应用程序变为DOWN,应用程序提供了错误代码:8888FFFF(灾难性故障)

要解决这个问题,我们的DBA做了一些研究,发现如果我们使用OLEDB连接字符串应用程序可以再次UP。

现在,由于我们正在使用OLEDB连接字符串,几乎98%的应用程序正在运行FINE。

2%小故障正面临在存储过程中使用基本插入查询的地方。

问题:

如果我使用OLEDB连接字符串而不是ODBC连接字符串,那么我得到ADODB.Recordset(0x800A0E78)错误。
关闭对象时不允许操作。

OLEDB连接字符串:

strConnectionString = "Provider=sqloledb;Data Source=path\MyDBServer;database=MyDB;uid=xxx;pwd=xxx"

ODBC连接字符串:

strConnectionString = "driver={SQL Server};server=path\MyDBServer;database=MyDB;uid=xxx;pwd=xxx"


我尝试了什么:
1.使用' Provider = SQLNCLI10;'而不是' Provider = sqloledb;'在连接字符串中。

我有一个work Around from stack exchange

If rsRecordSet.State <> 1 Then 
While rsRecordSet.State <> 1
Set rsRecordSet = rsRecordSet.NextRecordset
Wend
End If

如果这可以通过连接字符串解决,那么它会很棒。否则,我需要在每个错误的地方应用解决方案。

谢谢!

1 个答案:

答案 0 :(得分:1)

对于OLEDB提供程序,SQL-Server在最终结果集之前返回已关闭记录集中每个查询所触及的行数。提供程序使用此记录集来检测某些类型的错误,并关闭以确保用户不会将其与实际的最终结果集混淆。

您可以查找已经找到的下一个记录集,也可以在SP的开头或Select查询之前添加以下指令(如果您使用的是查询字符串),以便消除发送每个查询的行数:

SET NOCOUNT ON;

我更喜欢这个最后的解决方案,因为它使VBScript代码更简单,但它只是一个品味问题。

在你的情况下,为什么原来的ODBC提供者不再工作了,我不知道,但是看看connectionstrings.com;您可以尝试使用更新的ODBC提供程序。但是,纯OLEDB提供程序应该为您提供比ADO更好的ADO性能。