您的位置:首页 > 数据库

使用ODBC和OLEDB两种方式执行同一个存储过程,结果不同的问题!

2006-07-26 13:16 585 查看
最近我在使用ODBC和OLEDB两种方式执行同一个存储过程,却获得两个不同的结果,很疑惑。

程序:
<%
dim objConn,rs
set  objConn=Server.Createobject("ADODB.Connection")
objConn.open "
Provider=SQLOLEDB;Data Source=ibm;Initial Catalog=eip;User Id=eip;Password=123;"

set rs=objConn.execute("dbo.test")
response.write rs("note")
%>

存储过程:
begin
  update t_system set note='系统4fdgddf44' where name='chinese';
  select note from t_system  where  name='chinese';
end

问题是:
当我用ODBC的方式:driver={SQL Server};server=ibm;uid=eip;password=123;database=eip  连接数据库,能够正常返回结果。

当用OLEDB的方式:Provider=SQLOLEDB;Data Source=ibm;Initial Catalog=eip;User Id=eip;Password=123;
却出现:

ADODB.Recordset 错误 '800a0cc1'

项目在所需的名称或序数中未被发现。

/test/ds1.asp,行7

很疑惑,这是为什么?同样的程序和存储过程,仅仅是改变了数据库的连接方式,却。。。

------------------------------------------------------------------------------------------------------------

在今天,我知道答案了!(在http://down.dvbbs.net/InfoView/Article_2926.html 有一个说明)

如果存储过程中有多个语句,则默认情况下,SQL Server在每个语句完成时给客户端应用程序发送一条消息,详细说明每个语句所影响的行数。大多数应用程序不需要这些消息。如果确信应用程序不需要他们,可以禁用这些消息,以提高慢速网络的性能。我们就可以通过SET NOCOUNT会话设置为应用程序禁用这些消息。(其实大部分应用程序都不需要这个值)

OLEDB和ODBC存在一个很大的差别,向odbc取记录集时,odbc过滤了上面所称的特殊记录集(那种只占位置但不能进行任何操作的记录集——多由create table或insert into产生),而向oledb取记录集时,oledb并没有将特殊记录集过滤。所以在使用存储过程返回记录集时,在不希望返回记录的地方,应该使用set nocount on禁止存储过程返回记录集,否则可能会绕很多弯路。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐