这个问题困扰了我两天了,实在没办法请大家帮帮忙。

Codinglife 2003-06-26 10:24:32
win2k + SqlServer2k(sp3) + vb6(sp5)

有一个存储过程返回记录集,在“查询分析器”中测试没问题,放在 vb 中 set rs =cmd.Execute 之后却什么也没有,也没有任何错误信息。
保证:参数都相同。这到底是为什么啊!!!
...全文
26 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
fling_boy 2003-06-26
  • 打赏
  • 举报
回复
在存储过程中最前面加上
SET NOCOUNT ON
----------------------------------------------------------------------------
ALTER Procedure CalculationIncrementRatio_SocialEconomic(@sStartYear as nvarchar(10),@sEndYear as nvarchar(10),@sAreaCode as nvarchar(500),
@sFields as nvarchar(500))
As
Declare @iCurrentFieldPosition as int,
@iCurrentFieldStartPosition as int,
@iCurrentFieldLength as int,
@sSql as nvarchar(1000),
@sCurrentField as nvarchar(50),
@sCurrentAreaCode as nvarchar(50),
@sCurrentAreaName as nvarchar(50),
@iValue as numeric(11,2),
@iOldValue as numeric(11,2),
@iYearInterval as numeric(11,2)

SET NOCOUNT ON

...
...
...
Codinglife 2003-06-26
  • 打赏
  • 举报
回复

Set rs = .Execute
'这行之后,rs 的 Fields.Count=0,够别说 RecordCount 了。

If rs.State = adStateClosed Then Exit Sub
'到这行就退出了, rs 根本没打开。

'因为要手工控制记录显示样式,如加此分组颜色等,所以没用控件直接绑定。

'请大家继续指教。谢谢。
atlasGS 2003-06-26
  • 打赏
  • 举报
回复
你用debug.print rs.recordcount 测试一下如果有值就说明是你的显示控件有问题
Codinglife 2003-06-26
  • 打赏
  • 举报
回复
呵呵,是有点长,不过我实在是没办法才请大家帮忙看看。

过程如下:
根据 @sAreaCode(“120102,120103....”),分别统计所有字段 @sFields(“总人口(万人),农村人口(万人)...”)的递增率,代码中“游标”部分真正往 #T1 中写数据,最后 Select xxxx From #T1 返回记录集,不知道为什么在 VB 中就是没有任何返回。

With cmd
.CommandType = adCmdStoredProc
.CommandText = "CalculationIncrementRatio_SocialEconomic"
.Parameters(1) = sStartYear
.Parameters(2) = sEndYear
.Parameters(3) = sAreaCodes
.Parameters(4) = sFields
Set rs = .Execute
If rs.State = adStateClosed Then Exit Sub
...................
...................
newcar 2003-06-26
  • 打赏
  • 举报
回复
好长呀up
Codinglife 2003-06-26
  • 打赏
  • 举报
回复
存储过程如下:
真的是第一次遇到这种问题,请高手请教。唉 好郁闷啊。。

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

SET NOCOUNT ON
Go

--select 区域名称,区域代码,年份 from 社会经济基本状况调查表 where 区域代码='120224' group by 区域代码,区域名称,年份
ALTER Procedure CalculationIncrementRatio_SocialEconomic(@sStartYear as nvarchar(10),@sEndYear as nvarchar(10),@sAreaCode as nvarchar(500),
@sFields as nvarchar(500))
As
Declare @iCurrentFieldPosition as int,
@iCurrentFieldStartPosition as int,
@iCurrentFieldLength as int,
@sSql as nvarchar(1000),
@sCurrentField as nvarchar(50),
@sCurrentAreaCode as nvarchar(50),
@sCurrentAreaName as nvarchar(50),
@iValue as numeric(11,2),
@iOldValue as numeric(11,2),
@iYearInterval as numeric(11,2)

Set @iYearInterval=Convert(numeric(4,0),@sEndYear)-Convert(numeric(4,0),@sStartYear)
Set @iCurrentFieldPosition=1
Set @iCurrentFieldStartPosition=1
--Set @iCurrentFieldLength=len(@sFields)

Create Table #T1(标识 int identity(1,1) not null,区域名称 nvarchar(50) null ,区域代码 nvarchar(50) null,年份 nvarchar(50),
指标名称 nvarchar(50) null,指标值 nvarchar(20) null,递增率 nvarchar(20) null,记录分组标记 nvarchar(10) null)

Create Table #T2(标识 int identity(1,1) not null,区域名称 nvarchar(50) null,区域代码 nvarchar(50) null,年份 nvarchar(50))

Set @iCurrentFieldPosition=CharIndex(',',@sFields,@iCurrentFieldPosition)
If (@iCurrentFieldPosition=0)
Set @iCurrentFieldLength=Len(@sFields)-@iCurrentFieldStartPosition+1
Else
Set @iCurrentFieldLength=@iCurrentFieldPosition-@iCurrentFieldStartPosition

While @iCurrentFieldPosition<>0
Begin
Set @sCurrentField=Substring(@sFields,@iCurrentFieldStartPosition,@iCurrentFieldLength)

--添加开始年份的统计值
Set @sSql='Insert Into #T2(区域名称,区域代码,年份)
Select 区域名称,区域代码,年份 From 社会经济基本状况调查表 Where 年份=' + @sStartYear + ' and 区域代码 in(' + @sAreaCode +
') Group by 区域代码,区域名称,年份'
Exec(@sSql)

Set @sSql='Insert Into #T1(区域名称,区域代码,年份,指标名称,指标值,递增率,记录分组标记)
Select a.区域名称,a.区域代码,a.年份,''' + @sCurrentField + ''',IsNull(b.[' + @sCurrentField + '],0),0,1 From #T2 a left outer join 社会经济基本状况调查表 b on a.区域名称=b.区域名称 and a.区域代码=b.区域代码 and a.年份=b.年份'
Exec(@sSql)


--return
Delete #T2

--添加结束年份的统计值
Set @sSql='Insert Into #T2(区域名称,区域代码,年份)
Select 区域名称,区域代码,年份 From 社会经济基本状况调查表 Where 年份=' + @sEndYear + ' and 区域代码 in(' + @sAreaCode +
') Group by 区域代码,区域名称,年份'
Exec(@sSql)

Declare IncrementRation_Cursor cursor For Select 区域代码,区域名称 From #T2

--使用游标插入值
OPEN IncrementRation_Cursor

FETCH NEXT FROM IncrementRation_Cursor
INTO @sCurrentAreaCode,@sCurrentAreaName

WHILE @@FETCH_STATUS = 0
BEGIN
--取得开始年份的值
Set @iOldValue=(Select 指标值 From #T1 where 指标名称=@sCurrentField and 区域代码=@sCurrentAreaCode and 年份=@sStartYear)

--插入结束年份的值
Set @sSql='Insert Into #T1(区域名称,区域代码,年份,指标名称,指标值,递增率)
Select ''' + @sCurrentAreaName + ''',''' + @sCurrentAreaCode + ''',''' + @sEndYear + ''',''' + @sCurrentField + ''',' +
'(Select [' + @sCurrentField + '] From 社会经济基本状况调查表 Where 年份=' + @sEndYear + ' and 区域代码=' +
@sCurrentAreaCode +'),1' --@iValue,@iValue/@iOldValue
Exec(@sSql)

--取得刚刚插入的结束年份的值
Set @iValue=(Select 指标值 From #T1 Where 指标名称=@sCurrentField and 区域代码=@sCurrentAreaCode and 年份=@sEndYear and 递增率=1)

--更新递增率
If @iOldValue=0
Update #T1 Set 递增率=0 Where 指标名称=@sCurrentField and 区域代码=@sCurrentAreaCode and 年份=@sEndYear and 递增率=1
Else
Update #T1 Set 递增率=Convert(numeric(5,3),Power(@iValue/@iOldValue,1/@iYearInterval))-1 Where 指标名称=@sCurrentField and 区域代码=@sCurrentAreaCode and 年份=@sEndYear and 递增率=1

FETCH NEXT FROM IncrementRation_Cursor
INTO @sCurrentAreaCode,@sCurrentAreaName
END

CLOSE IncrementRation_Cursor

DEALLOCATE IncrementRation_Cursor

Delete #T2


Set @iCurrentFieldStartPosition=@iCurrentFieldPosition+1
Set @iCurrentFieldPosition=CharIndex(',',@sFields,@iCurrentFieldPosition+1)
If (@iCurrentFieldPosition=0)
Set @iCurrentFieldLength=Len(@sFields)-@iCurrentFieldStartPosition+1
Else
Set @iCurrentFieldLength=@iCurrentFieldPosition-@iCurrentFieldStartPosition
End

/*--计算最后一个统计字段的值
Set @sCurrentField=SubString(@sFields,@iCurrentFieldStartPosition,@iCurrentFieldLength)
--添加开始年份的统计值
Set @sSql='Insert Into #T2(区域名称,区域代码,年份)

Select 区域名称,区域代码,年份 From 社会经济基本状况调查表 Where 年份=' + @sStartYear + ' and 区域代码 in(' + @sAreaCode +
') Group by 区域代码,区域名称,年份'
Exec(@sSql)

Set @sSql='Insert Into #T1(区域名称,区域代码,年份,指标名称,指标值,递增率,记录分组标记)
Select a.区域名称,a.区域代码,a.年份,''' + @sCurrentField + ''',IsNull(b.[' + @sCurrentField + '],0),0,1 From #T2 a left outer join 社会经济基本状况调查表 b on a.区域名称=b.区域名称 and a.区域代码=b.区域代码 and a.年份=b.年份'
Exec(@sSql)

Delete #T2

--添加结束年份的统计值
Set @sSql='Insert Into #T2(区域名称,区域代码,年份)
Select 区域名称,区域代码,年份 From 社会经济基本状况调查表 Where 年份=' + @sEndYear + ' and 区域代码 in(' + @sAreaCode +
') Group by 区域代码,区域名称,年份'
Exec(@sSql)

--使用游标插入值
OPEN IncrementRation_Cursor

FETCH NEXT FROM IncrementRation_Cursor
INTO @sCurrentAreaCode,@sCurrentAreaName

WHILE @@FETCH_STATUS = 0
BEGIN
--取得开始年份的值
Set @iOldValue=(Select 指标值 From #T1 where 指标名称=@sCurrentField and 区域代码=@sCurrentAreaCode and 年份=@sStartYear)

--插入结束年份的值
Set @sSql='Insert Into #T1(区域名称,区域代码,年份,指标名称,指标值,递增率)
Select ''' + @sCurrentAreaName + ''',''' + @sCurrentAreaCode + ''',''' + @sEndYear + ''',''' + @sCurrentField + ''',' +
'(Select [' + @sCurrentField + '] From 社会经济基本状况调查表 Where 年份=' + @sEndYear + ' and 区域代码=' +
@sCurrentAreaCode +'),1' --@iValue,@iValue/@iOldValue
Exec(@sSql)

--取得刚刚插入的结束年份的值
Set @iValue=(Select 指标值 From #T1 Where 指标名称=@sCurrentField and 区域代码=@sCurrentAreaCode and 年份=@sEndYear and 递增率=1)

--更新递增率
If @iOldValue=0
Update #T1 Set 递增率=0 Where 指标名称=@sCurrentField and 区域代码=@sCurrentAreaCode and 年份=@sEndYear and 递增率=1
Else
Update #T1 Set 递增率=Convert(numeric(5,3),Power(@iValue/@iOldValue,1/@iYearInterval))-1 Where 指标名称=@sCurrentField and 区域代码=@sCurrentAreaCode and 年份=@sEndYear and 递增率=1

FETCH NEXT FROM IncrementRation_Cursor
INTO @sCurrentAreaCode,@sCurrentAreaName
END*/

--DEALLOCATE IncrementRation_Cursor

Select 区域名称,区域代码,年份,指标名称,指标值,递增率,记录分组标记 From #T1 Order by 区域代码,区域名称,指标名称,年份

Drop Table #T2
Drop Table #T1




GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET NOCOUNT ON
GO
fling_boy 2003-06-26
  • 打赏
  • 举报
回复
在存储过程中最前面加上
SET NOCOUNT ON
Codinglife 2003-06-26
  • 打赏
  • 举报
回复
谢谢:fling_boy(andy--天意)(冰狱绝剑),问题解决了。哈哈。

不过,我以前也写过很多存储过程,从没加上过这句话(以后,一定会每次都加上),在VB中也从没遇上过这种问题。
不返回记数会有这种错误,不太好理解啊。。
马上给分,谢谢大家。

1,216

社区成员

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

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