mshflexgrid及存储过程的奇怪问题

feihot 2010-04-06 09:51:26
环境:VB6+SP6 ,MS SQL2000+SP4
内容:
1,在VB6中调用 SQL2000的存储过程,然后将结果 set mshflexgrid1.datasource=ado1.rs
2,存储过程中就一条语句 select A1,A2,A3,A4,A5......A13 from table1

测试如下:
1,如果直接将select A1.....A13 from table1 语句写在VB中 一切正常.
2,如果用存储过程调用,奇怪问题如下:
1)存储过程中 ,select 所有字段 from table1 ,table1中有1413条记录,总是显示820多条记录
2)存储过程中 ,select 少些字段 ,比如 select A1,A2.....A8 from table1 ,则会多显示100多条数据,当只select A1,A2,A3 FROM table1 或其他3,4个字段,则会显示全部记录
3)另外测试table2 ,存储过程中只写 select * from table2,table2里面有7000多条记录,结果全部显示,一切正常.table2
有13个字段

疑问:感觉存储过程返回结果好象有个缓存大小,越少字段显示越多记录.但3) 测试又没法解释.


困扰多日,请高手指点 谢谢
...全文
179 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
三断笛 2010-04-08
  • 打赏
  • 举报
回复
还可以用vsflexgrid就没有这种问题
三断笛 2010-04-08
  • 打赏
  • 举报
回复
这种情况见多了。
mshflexgrid的bug
与游标有关。
服务器游标(adUseServer)和仅向前游标(adopenforwardonly)容易引起此错误。

解决办法是:
用Recordset的Open方法来执行存储过程返回记录集,此时可以使用客户端游标和非仅向前游标。
对于仅用于返回数据的存储过程,使用用函数替代比较好。
xmjieyun 2010-04-08
  • 打赏
  • 举报
回复
关注中 ,,,描述的问题有点奇怪 因为table2正常,应该存储过程及VB调用是没问题的 我没碰到过
feihot 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 xxyj6450 的回复:]
这种情况见多了。
mshflexgrid的bug
与游标有关。
服务器游标(adUseServer)和仅向前游标(adopenforwardonly)容易引起此错误。

解决办法是:
用Recordset的Open方法来执行存储过程返回记录集,此时可以使用客户端游标和非仅向前游标。
对于仅用于返回数据的存储过程,使用用函数替代比较好。
[/Quote]

谢谢啊 我是使用command.execute的方法返回给ADO的 我试试你的方法 函数比较少用,我有参数的存储过程应该函数替代不了?
feihot 2010-04-07
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 chinaboyzyq 的回复:]
引用 9 楼 feihot 的回复:
在VB里调用存储过程,然后用
Debug.Print Adodc1.Recordset.RecordCount

这个显示-1.

用客户端游标。
Adodc1.CursorLocation = adUseClient
[/Quote]

一样的 好象VB调用存储过程 默认就是仅向前只读.
feihot 2010-04-07
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 leftie 的回复:]
存储过程有参数,则可能问题出在参数上
[/Quote]

参数没问题的,可以显示记录,但显示不全.所以我现在测试就不带参数,就一个简单select 语句,就会出现这样怪问题.因为table1 table2,我想是不是跟表结构有关系,看了半天也搞不懂.
问题其实就很简单:存储过程 select table2 ,7000多条记录显示正常.存储过程 select * from table1,1000多条记录显示不全,显示800多条,存储过程 select 其中3,4个字段 from table1,则可以显示全部记录.select 越多字段 from table1 ,则显示越少记录.感觉有个什么限制在里面
chinaboyzyq 2010-04-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 feihot 的回复:]
在VB里调用存储过程,然后用
Debug.Print Adodc1.Recordset.RecordCount

这个显示-1.
[/Quote]
用客户端游标。
Adodc1.CursorLocation = adUseClient
饮水需思源 2010-04-07
  • 打赏
  • 举报
回复
存储过程有参数,则可能问题出在参数上
feihot 2010-04-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 leftie 的回复:]
不用存储过程,用视图试试
[/Quote]

不用存储过程,直接在VB里用ADO 就都正常,无论1万条还是更多数据都没问题.
因为我是要用存储过程的,要传参数,就是记录显示不全,觉得很怪,才直接用table1 table2 测试,才发现这么奇怪的问题.
feihot 2010-04-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 chinaboyzyq 的回复:]
我测试的没有此现象,26万条记录用存储过程出库

在查询分析中统计记录数
select count(*) from table
在VB里调用存储过程,然后用
Debug.Print Adodc1.Recordset.RecordCount

观查两个结果是否一样。
[/Quote]

在VB里调用存储过程,然后用
Debug.Print Adodc1.Recordset.RecordCount

这个显示-1.
feihot 2010-04-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lyserver 的回复:]
应该不会出现这种情况,如果真的出现了,那不是存储过程的原因,而可能是你的可用内存不足,使用任务管理器确认一下,如果数据库与VB在同一机器上,不妨直接使用ADO+SQL语句访问,因为这样可以选择服务器端游标,减少内存消耗,尽管降低了运行效率,但可以避免一些意外情况。
[/Quote]

关键是我select table2的时候就完全正常,table2有9000多条记录.我前面也说了 直接用ado+sql写在VB中一点问题没有,调用存储过程就会这样,选择字段少一点,记录多显示一点.太奇怪了 VB,SQL2000在一台机器上,应该不是内存问题.
king06 2010-04-07
  • 打赏
  • 举报
回复
问题比较蹊跷,关注.
feihot 2010-04-07
  • 打赏
  • 举报
回复
z这个奇怪问题 有人有遇到吗
舉杯邀明月 2010-04-07
  • 打赏
  • 举报
回复
友情Up..............
lyserver 2010-04-07
  • 打赏
  • 举报
回复
应该不会出现这种情况,如果真的出现了,那不是存储过程的原因,而可能是你的可用内存不足,使用任务管理器确认一下,如果数据库与VB在同一机器上,不妨直接使用ADO+SQL语句访问,因为这样可以选择服务器端游标,减少内存消耗,尽管降低了运行效率,但可以避免一些意外情况。
饮水需思源 2010-04-07
  • 打赏
  • 举报
回复
不用存储过程,用视图试试
chinaboyzyq 2010-04-07
  • 打赏
  • 举报
回复
我测试的没有此现象,26万条记录用存储过程出库

在查询分析中统计记录数
select count(*) from table
在VB里调用存储过程,然后用
Debug.Print Adodc1.Recordset.RecordCount

观查两个结果是否一样。
feihot 2010-04-06
  • 打赏
  • 举报
回复
附上table1及 table2结构,请高手指点

table1结构////////1413条记录
CREATE TABLE [dbo].[aaa] (
[验收单号] [nvarchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[验收日期] [datetime] NULL ,
[通用名称] [nvarchar] (80) COLLATE Chinese_PRC_CI_AS NULL ,
[商品名称] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[剂型] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[规格] [nvarchar] (30) COLLATE Chinese_PRC_CI_AS NULL ,
[生产企业] [nvarchar] (30) COLLATE Chinese_PRC_CI_AS NULL ,
[批准文号] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[批号] [nvarchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[有效期至] [datetime] NULL ,
[单位] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[数量] [real] NULL ,
[供应企业] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[质量状况] [varchar] (4) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[验收结论] [varchar] (4) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[进购人] [varchar] (6) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[验收人] [varchar] (4) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[备注] [nvarchar] (20) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]

table2结构/////////////7000多条记录
CREATE TABLE [dbo].[Sale] (
[销售日期] [smalldatetime] NOT NULL ,
[分店编号] [int] NOT NULL ,
[商品编号] [int] NOT NULL ,
[机号] [int] NOT NULL ,
[数量] [real] NULL ,
[小计] [float] NULL ,
[折扣金额] [real] NULL ,
[进货成本] [real] NULL ,
[税率] [real] NULL ,
[验收单号] [nvarchar] (16) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[批号] [nvarchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[进货价] [real] NULL ,
[失效期] [smalldatetime] NULL
) ON [PRIMARY]
feihot 2010-04-06
  • 打赏
  • 举报
回复
附上table1及 table2结构,请高手指点

table1结构////////1413条记录
CREATE TABLE [dbo].[aaa] (
[验收单号] [nvarchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[验收日期] [datetime] NULL ,
[通用名称] [nvarchar] (80) COLLATE Chinese_PRC_CI_AS NULL ,
[商品名称] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[剂型] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[规格] [nvarchar] (30) COLLATE Chinese_PRC_CI_AS NULL ,
[生产企业] [nvarchar] (30) COLLATE Chinese_PRC_CI_AS NULL ,
[批准文号] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[批号] [nvarchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[有效期至] [datetime] NULL ,
[单位] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[数量] [real] NULL ,
[供应企业] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[质量状况] [varchar] (4) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[验收结论] [varchar] (4) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[进购人] [varchar] (6) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[验收人] [varchar] (4) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[备注] [nvarchar] (20) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]

table2结构/////////////7000多条记录
CREATE TABLE [dbo].[Sale] (
[销售日期] [smalldatetime] NOT NULL ,
[分店编号] [int] NOT NULL ,
[商品编号] [int] NOT NULL ,
[机号] [int] NOT NULL ,
[数量] [real] NULL ,
[小计] [float] NULL ,
[折扣金额] [real] NULL ,
[进货成本] [real] NULL ,
[税率] [real] NULL ,
[验收单号] [nvarchar] (16) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[批号] [nvarchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[进货价] [real] NULL ,
[失效期] [smalldatetime] NULL
) ON [PRIMARY]

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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