没有道理的问题:PB中的DataWindow调用存储过程在不同版本下的问题?

evergreen 2002-09-29 12:59:51
使用带参数的存储过程作为DataWindow的数据源,在MS SQL Server 2000下没有问题,单身在MS SQL Server 7.0下却出现错误,说什么“select ,”之类的错误,faint!
开发环境:Windows 2000 + PB8.02 + MS SQL Server 2000/7.0
有没有其他人也碰到过这个问题,我找不到问题的根源,晕了!!!
...全文
63 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sbks 2002-10-10
  • 打赏
  • 举报
回复
gz
evergreen 2002-10-10
  • 打赏
  • 举报
回复
谢谢大家的讨论,我的存储过程很大,问题奇怪的地方就在于存储过程在在MS SQL Server 7.0中的查询分析器中执行没有问题(带参数),结果完全正确!没有错误!!但就是在使用MS SQL Server 7.0的同时在PB中用DataWindow绑定调用就出问题。调用的代码很简单:就是在DataWindos的Retrieve()方法中带一个参数,从理论上说应该没有问题,因为在MS SQL Server 2000下可以正常执行。
所以我估计问题的出现未必在于MS SQL Server 7.0的Server上,不知大家还有什么高见?
这个问题弄得我很烦恼,难度非要用MS SQL Server 2000????
不过ghost_old(PB初级程序员)说的方法也许可以一试
--------------
(调用的错误信息大概意思是select错误)
我的存储过程如下:

/*************************
* 雨量日报表
* 输出:结果集
* 所有站当天24小时雨量数据,不足补齐
*/
CREATE PROCEDURE up_reportDayRain
(@dtRetrieve char(10)='2002-09-12')
AS

declare @HourDiv int
declare @dtToday datetime--当天时间(需要检索数据的时间)

declare @iStcd int
declare @strStnm sysname
declare @iCount int
declare @dtStart datetime--该报表数据的起始时间
declare @dtCurr datetime--当前时间段的起始时间
declare @dtEnd datetime--当前时间段的结束时间
declare @fDtRn numeric(5)

declare @iStNum int --当前数据库中站的数目
declare @i int
declare @strDataSql varchar(2000) --雨量数据sql语句

set nocount on

set @HourDiv = 1 -- 时间间隔
/*检索的时间*/
if @dtRetrieve = ''
begin
set @dtToday = getdate()
end else
begin
set @dtToday = cast(@dtRetrieve + ' 08:00:00' as datetime)
end

/*获取站的数目*/
set @iStNum = (select count(*) from V_STATION_rain)

/*建立临时表,保证至少12列*/
create table #tempdb1(bgtm datetime not null, endtm datetime not null,
s1 numeric(5) null, s2 numeric(5) null, s3 numeric(5) null, s4 numeric(5) null,
s5 numeric(5) null, s6 numeric(5) null, s7 numeric(5) null, s8 numeric(5) null,
s9 numeric(5) null, s10 numeric(5) null, s11 numeric(5) null, s12 numeric(5) null)

/*获取起始日期*/
if datepart(hour,getdate()) < 8
begin
set @dtStart = convert(char(10),dateadd(day,-1,@dtToday),120) + ' 08:00:00'
end else
begin
set @dtStart = convert(char(10),@dtToday,120) + ' 08:00:00'
end

set @iCount = 0
set @dtCurr = @dtStart
WHILE @iCount < 24 BEGIN
/*计算当前时间段的结束时间*/
set @dtEnd = dateadd(hour,@HourDiv,@dtCurr)
set @i = @iStNum --重置站数循环变量
/*重置数据sql语句*/
set @strDataSql = "insert into #tempdb1 values('"
set @strDataSql = @strDataSql + convert(char(23),@dtCurr,121) + "','" + convert(char(23),@dtEnd,121) + "'"
--print 'ada' + @strDataSql
/*----------------------- 获取所有雨量站 ---------------------------- */
DECLARE CUR_station CURSOR FOR --建立游标
SELECT stcd,stnm FROM V_STATION_rain
order by stcd
OPEN CUR_station --打开游标
WHILE 1=1 begin --按记录读出[雨量测站]表的所有站
FETCH NEXT FROM CUR_station INTO @iStcd,@strStnm
IF @@FETCH_STATUS <> 0
BREAK
--print 'aaa' + @strStnm
/*获取每个站当前时间段的数据*/
set @fDtRn = (select sum(DTRN) from RAINHOUR where ENDTM >= @dtCurr and ENDTM < @dtEnd and stcd=@iStcd)
if @fDtRn = null
begin
set @strDataSql = @strDataSql + ",NULL"
end else
begin
if @fDtRn = 0
begin --数值为0时空处理
set @strDataSql = @strDataSql + ",NULL"
end else
begin
set @strDataSql = @strDataSql + "," + cast(@fDtRn as varchar(10))
end
end

END
/*判断站的完整性*/
while @i < 12
begin
set @strDataSql = @strDataSql + ",NULL"
set @i = @i + 1
end
set @strDataSql = @strDataSql + ")"

exec(@strDataSql)
set @dtCurr = @dtEnd
set @iCount = @iCount + 1 --记录时间段的数目
CLOSE CUR_station
DEALLOCATE CUR_station
END


set nocount off
select
TM = convert(char(5),bgtm,108) + '-' + convert(char(5),endtm,108),
s1,
s2,
s3,
s4,
s5,
s6,
s7,
s8,
s9,
s10,
s11,
s12
from #tempdb1
GO
xiaobzg 2002-09-29
  • 打赏
  • 举报
回复
先把存储过程在sql中调试没有问题
把语法贴出来看一看
奇遇 2002-09-29
  • 打赏
  • 举报
回复
贴出来看看
evergreen 2002-09-29
  • 打赏
  • 举报
回复
upup!!
大家帮忙想想办法也行呀,出了力就有分的!!
zqllyh 2002-09-29
  • 打赏
  • 举报
回复
可能是数据转换的错误吧?
把数值类型的全换成FLOAT看看。
ghost_old 2002-09-29
  • 打赏
  • 举报
回复
请把 pb8 /server 下的PBSYC.SQL and PBSYC2.SQL 在MS SQL Server 7.0执行一遍.问题得到圆满解决.

609

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder DataWindow
社区管理员
  • DataWindow社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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