怎么老是返回-1啊??????请好心人指点,在线等!

Barry1058 2004-05-08 07:55:34
在数据库Test01中自定义了一个存储过程user_simple

CREATE PROCEDURE dbo.user_simple
AS
SELECT * FROM usertest01
GO


在ASP文件中调用该存储过程如下
<% set conn=server.CreateObject("adodb.connection")
set cmd=server.CreateObject("adodb.command")
conn.open "driver={SQL Server};Server=IBM-MILLEN;uid=sa;password=1234;dat
abase=Test01"
set cmd.ActiveConnection=conn
cmd.CommandText="user_simple"
set rs=cmd.Execute
response.Write(rs.RecordCount)
conn.Close

%>
但是返回的RecordCount总是-1,好心人给看看到底是什么问题啊?
...全文
145 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
online 2004-05-08
  • 打赏
  • 举报
回复
如果这样执行
conn.execute ("sql语句")
使用
conn.CursorLocation=3 '注意设置这个属性

如果使用记录集
使用rs.open "sql语句",conn,1,3



附带一个小资料:
-----------------------------------
常数 常数值 说明
-----------------------------------
adOpenForwardOnly 0 缺省值,启动一个只能向前移动的游标(Forward Only)。
adOpenKeyset 1 启动一个Keyset类型的游标。
adOpenDynamic 2 启动一个Dynamic类型的游标。
adOpenStatic 3 启动一个Static类型的游标。
-----------------------------------
以上几个游标类型将直接影响到Recordset对象所有的属性和方法,以下列表说明他们之间的区别。

---------------------------------------------
Recordset属性 adOpenForwardOnly adOpenKeyset adOpenDynamic adOpenStatic
---------------------------------------------
AbsolutePage 不支持 不支持 可读写 可读写
AbsolutePosition 不支持 不支持 可读写 可读写
ActiveConnection 可读写 可读写 可读写 可读写
BOF 只读 只读 只读 只读
Bookmark 不支持 不支持 可读写 可读写
CacheSize 可读写 可读写 可读写 可读写
CursorLocation 可读写 可读写 可读写 可读写
CursorType 可读写 可读写 可读写 可读写
EditMode 只读 只读 只读 只读
EOF 只读 只读 只读 只读
Filter 可读写 可读写 可读写 可读写
LockType 可读写 可读写 可读写 可读写
MarshalOptions 可读写 可读写 可读写 可读写
MaxRecords 可读写 可读写 可读写 可读写
PageCount 不支持 不支持 只读 只读
PageSize 可读写 可读写 可读写 可读写
RecordCount 不支持 不支持 只读 只读
Source 可读写 可读写 可读写 可读写
State 只读 只读 只读 只读
Status 只读 只读 只读 只读
AddNew 支持 支持 支持 支持
CancelBatch 支持 支持 支持 支持
CancelUpdate 支持 支持 支持 支持
Clone 不支持 不支持
Close 支持 支持 支持 支持
Delete 支持 支持 支持 支持
GetRows 支持 支持 支持 支持
Move 不支持 支持 支持 支持
MoveFirst 支持 支持 支持 支持
MoveLast 不支持 支持 支持 支持
MoveNext 支持 支持 支持 支持
MovePrevious 不支持 支持 支持 支持
NextRecordset 支持 支持 支持 支持
Open 支持 支持 支持 支持
Requery 支持 支持 支持 支持
Resync 不支持 不支持 支持 支持
Supports 支持 支持 支持 支持
Update 支持 支持 支持 支持
UpdateBatch 支持 支持 支持 支持
----------------------------------------
其中NextRecordset方法并不适用于Microsoft Access数据库。

LockType
Recordset对象Open方法的LockType参数表示要采用的Lock类型,如果忽略这个参数,那么系统会以Recordset对象的LockType属性为预设值。LockType参数包含adLockReadOnly、adLockPrssimistic、adLockOptimistic及adLockBatchOptimistic等,分述如下:

-----------------------------------
常数 常数值 说明
-----------------------------------
adLockReadOnly 1 缺省值,Recordset对象以只读方式启动,无法运行AddNew、Update及Delete等方法
adLockPrssimistic 2 当数据源正在更新时,系统会暂时锁住其他用户的动作,以保持数据一致性。
adLockOptimistic 3 当数据源正在更新时,系统并不会锁住其他用户的动作,其他用户可以对数据进行增、删、改的操作。
adLockBatchOptimistic 4 当数据源正在更新时,其他用户必须将CursorLocation属性改为adUdeClientBatch才能对数据进行增、删、改的操作。

=====定义数据库连接的一些常量
<%
Const adOpenForwardOnly = 0 '游标只向前浏览记录,不支持分页、Recordset、BookMark
Const adOpenKeyset = 1 '键集游标,其他用户对记录说做的修改将反映到记录集中,但其他用户增加或删除记录不会反映到记录集中。支持分页、Recordset、BookMark
Const adOpenDynamic = 2 '动态游标功能最强,但耗资源也最多。用户对记录说做的修改,增加或删除记录都将反映到记录集中。支持全功能浏览(ACCESS不支持)。
Const adOpenStatic = 3 '静态游标,只是数据的一个快照,用户对记录说做的修改,增加或删除记录都不会反映到记录集中。支持向前或向后移动

Const adLockReadOnly = 1 '锁定类型,默认的,只读,不能作任何修改
Const adLockPessimistic = 2 '当编辑时立即锁定记录,最安全的方式
Const adLockOptimistic = 3 '只有在调用Update方法时才锁定记录集,而在此前的其他操作仍可对当前记录进行更改、插入和删除等
Const adLockBatchOptimistic = 4 '当编辑时记录不会被锁定,而更改、插入和删除是在批处理方式下完成的

Const adCmdText = &H0001
Const adCmdTable = &H0002
%>

renaski 2004-05-08
  • 打赏
  • 举报
回复
哦,估计差不多吧。
也是游标呀。
汗~~`如果解释不行的话,以后慢慢体会吧。谢谢了!
zjcxc 元老 2004-05-08
  • 打赏
  • 举报
回复
当然不是啦,说了是这个嘛:

rs.CursorLocation=3 '注意设置这个属性
renaski 2004-05-08
  • 打赏
  • 举报
回复
是不是就是在ACCESS里的
Rs.Open Sql,conn,1,2
Rs.Open Sql,conn,1,3
的区别啊?
我想应该是的吧。
zjcxc 元老 2004-05-08
  • 打赏
  • 举报
回复
因为要得到recordcount,所以必须设置CursorLocation=3

这样,所有的数据调到客户端,才能得到recordcount
如果不设置,默认是2,数据只会调一部分,这样效率是高了,但就得不到recordcount,因为数据没完全调出来,所以根本得不到recordcount.


所以性能的问题要视乎你的要求而定,如果你十分重视效率,就不要用recordcount
如果你要用recordcount,就得浪费一定资源.

鱼与熊掌不可皆得.
zjcxc 元老 2004-05-08
  • 打赏
  • 举报
回复
我不是已经给了你两种方法吗? 任意一种都可以解决.

至于你说的性能问题,根本不存在那个问题. 你自己写的那种调用,和我给的两种方法,根本不存在性能的区别.
vileboy 2004-05-08
  • 打赏
  • 举报
回复
把游标类型设为客户端。
p_cnn.CursorLocation=adUseClient
Barry1058 2004-05-08
  • 打赏
  • 举报
回复
我要做的是在ASP中使用SQL语句和调用存储过程的性能比较,因此这个程序段想直接调用存储过程,如果这样
set rs = server.createobject("adodb.recordset")
rs.open "exec user_simple",conn,3,1
等于ASP中又使用了SQL语句,恐怕会影响测试结果的

楼上的说是游标类型问题,怎么解决呢?
zjcxc 元老 2004-05-08
  • 打赏
  • 举报
回复
'对于没有参数的存储过程,可以这样简化地调用,同样可以正确地得到recordcount

'在ASP文件中调用该存储过程如下
<%
set conn=server.CreateObject("adodb.connection")

'添加一个recordset对象
set rs=server.CreateObject("adodb.recordset")

conn.open "driver={SQL Server};Server=IBM-MILLEN;uid=sa;password=1234;dat
abase=Test01"


'用这种方法打开
rs.CursorLocation=3 '注意设置这个属性
rs.open "exec user_simple",conn,1,1

response.Write(rs.RecordCount)
conn.Close
%>
zjcxc 元老 2004-05-08
  • 打赏
  • 举报
回复
'修改调用代码如下:

'在ASP文件中调用该存储过程如下
<%
set conn=server.CreateObject("adodb.connection")
set cmd=server.CreateObject("adodb.command")

'添加一个recordset对象
set rs=server.CreateObject("adodb.recordset")

conn.open "driver={SQL Server};Server=IBM-MILLEN;uid=sa;password=1234;dat
abase=Test01"
set cmd.ActiveConnection=conn
cmd.CommandText="user_simple"

'用这种方法打开
rs.CursorLocation=3 '注意设置这个属性
rs.open cmd,conn,1,1

response.Write(rs.RecordCount)
conn.Close
%>
8992026 2004-05-08
  • 打赏
  • 举报
回复
游标类型问题
cloudchen 2004-05-08
  • 打赏
  • 举报
回复
set rs = server.createobject("adodb.recordset")
rs.open "exec user_simple",conn,3,1
response.write rs.recordcount
rs.close
conn.close
wzh1215 2004-05-08
  • 打赏
  • 举报
回复
在查询分析器中执行:
exec Test01.dbo.user_simple
看看有没有结集!

34,589

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧