使用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禁止存储过程返回记录集,否则可能会绕很多弯路。
程序:
<%
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禁止存储过程返回记录集,否则可能会绕很多弯路。
相关文章推荐
- 获取Executor提交的并发执行的任务返回结果的两种方式/ExecutorCompletionService使用
- JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没
- php使用odbc执行复杂函数遇到的问题,sql语句直接在sqlserver数据库中运行有结果,使用php总是为空
- 使用SQLyog软件(执行存储过程)的一个怪异问题!!!
- 获取Executor提交的并发执行的任务返回结果的两种方式/ExecutorCompletionService使用
- 使用ODBC方式读取sybase数据库的时候,如果字符串大于4k(4096),结果只能读取到4096个字符(关键字 SYBASE TEXT 4096 截断 TRUNCATE)
- 使用两种不同的方式复制字符串
- jersey 文件上传-使用两种不同的方式
- 〔问题〕Microsoft OLE DB Provider for ODBC Drivers (0x80004005)[Microsoft][ODBC Microsoft Access Driver] 操作必须使用一个可更新的查询
- 在使用Hibernate时,因为一个查询需要更多的表连接而要使用SQL来解决性能问题。然而返回的结果集中包含了没有映射的Entity类中的表字段,在这个SQL中还有使用如何将层次关系的父子结点显示为横行
- 一个Codility上的练习遇到和预期结果不同的问题。
- Hibernate查询之SQL查询,查询结果用new新对象的方式接受,hql查询,通过SQL查询的结果返回到一个实体中,查询不同表中内容,并将查到的不同表中的内容放到List中
- JSP中使用AJAX示例:分别将结果提交为STRUTS,SERVLET,WEBWORK的不同操作方式
- 用两种方式获取Bitmap的不同结果
- 在执行一个 CLR 例程或 SQL Server 2005 中使用程序集时的错误消息:"在主机存储区中的组件在 GAC 中有一个不同的签名比程序集。
- 使用java判断一个地址是否可用的两种方式
- 实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
- C#执行oraclec存储过程获取返回值的一个问题(使用到临时表)
- 《关于在MFC中使用ODBC方式连接数据库可能出现的问题》第一篇