环境: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.   

    附上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]
      

  2.   

    附上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]
      

  3.   

    我测试的没有此现象,26万条记录用存储过程出库在查询分析中统计记录数
    select count(*) from table
    在VB里调用存储过程,然后用
    Debug.Print Adodc1.Recordset.RecordCount观查两个结果是否一样。
      

  4.   

    应该不会出现这种情况,如果真的出现了,那不是存储过程的原因,而可能是你的可用内存不足,使用任务管理器确认一下,如果数据库与VB在同一机器上,不妨直接使用ADO+SQL语句访问,因为这样可以选择服务器端游标,减少内存消耗,尽管降低了运行效率,但可以避免一些意外情况。
      

  5.   


    关键是我select table2的时候就完全正常,table2有9000多条记录.我前面也说了 直接用ado+sql写在VB中一点问题没有,调用存储过程就会这样,选择字段少一点,记录多显示一点.太奇怪了  VB,SQL2000在一台机器上,应该不是内存问题.
      

  6.   


    在VB里调用存储过程,然后用
    Debug.Print Adodc1.Recordset.RecordCount  这个显示-1.
      

  7.   


    不用存储过程,直接在VB里用ADO 就都正常,无论1万条还是更多数据都没问题.
    因为我是要用存储过程的,要传参数,就是记录显示不全,觉得很怪,才直接用table1 table2 测试,才发现这么奇怪的问题.
      

  8.   

    用客户端游标。
    Adodc1.CursorLocation = adUseClient
      

  9.   


    参数没问题的,可以显示记录,但显示不全.所以我现在测试就不带参数,就一个简单select 语句,就会出现这样怪问题.因为table1 table2,我想是不是跟表结构有关系,看了半天也搞不懂.
    问题其实就很简单:存储过程 select table2 ,7000多条记录显示正常.存储过程 select * from table1,1000多条记录显示不全,显示800多条,存储过程 select 其中3,4个字段 from table1,则可以显示全部记录.select 越多字段 from table1 ,则显示越少记录.感觉有个什么限制在里面
      

  10.   

    关注中 ,,,描述的问题有点奇怪 因为table2正常,应该存储过程及VB调用是没问题的  我没碰到过
      

  11.   

    这种情况见多了。
    mshflexgrid的bug
    与游标有关。
    服务器游标(adUseServer)和仅向前游标(adopenforwardonly)容易引起此错误。解决办法是:
    用Recordset的Open方法来执行存储过程返回记录集,此时可以使用客户端游标和非仅向前游标。
    对于仅用于返回数据的存储过程,使用用函数替代比较好。
      

  12.   

    还可以用vsflexgrid就没有这种问题
      

  13.   


    谢谢啊 我是使用command.execute的方法返回给ADO的  我试试你的方法 函数比较少用,我有参数的存储过程应该函数替代不了?