环境: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) 测试又没法解释.
困扰多日,请高手指点 谢谢
内容:
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) 测试又没法解释.
困扰多日,请高手指点 谢谢
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]
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]
select count(*) from table
在VB里调用存储过程,然后用
Debug.Print Adodc1.Recordset.RecordCount观查两个结果是否一样。
关键是我select table2的时候就完全正常,table2有9000多条记录.我前面也说了 直接用ado+sql写在VB中一点问题没有,调用存储过程就会这样,选择字段少一点,记录多显示一点.太奇怪了 VB,SQL2000在一台机器上,应该不是内存问题.
在VB里调用存储过程,然后用
Debug.Print Adodc1.Recordset.RecordCount 这个显示-1.
不用存储过程,直接在VB里用ADO 就都正常,无论1万条还是更多数据都没问题.
因为我是要用存储过程的,要传参数,就是记录显示不全,觉得很怪,才直接用table1 table2 测试,才发现这么奇怪的问题.
Adodc1.CursorLocation = adUseClient
参数没问题的,可以显示记录,但显示不全.所以我现在测试就不带参数,就一个简单select 语句,就会出现这样怪问题.因为table1 table2,我想是不是跟表结构有关系,看了半天也搞不懂.
问题其实就很简单:存储过程 select table2 ,7000多条记录显示正常.存储过程 select * from table1,1000多条记录显示不全,显示800多条,存储过程 select 其中3,4个字段 from table1,则可以显示全部记录.select 越多字段 from table1 ,则显示越少记录.感觉有个什么限制在里面
mshflexgrid的bug
与游标有关。
服务器游标(adUseServer)和仅向前游标(adopenforwardonly)容易引起此错误。解决办法是:
用Recordset的Open方法来执行存储过程返回记录集,此时可以使用客户端游标和非仅向前游标。
对于仅用于返回数据的存储过程,使用用函数替代比较好。
谢谢啊 我是使用command.execute的方法返回给ADO的 我试试你的方法 函数比较少用,我有参数的存储过程应该函数替代不了?