问题描述
我用的是VS2010自带的ReportViewer,绑定存储过程。我发现直接绑定表或者存储过程都可以正常显示数据源。但是,如果存储过程中有创建的临时表,那么就不显示数据源了。1、在绑定存储过程的时候,选择完存储过程,点击确定保存之后。【数据源】里边是空的,【可用数据集】里边也是空的,什么都不显示。是什么原因?2、下边是我的存储过程:大概的意思就是创建一个临时表,把查询的数据存临时表里,在更新临时表。如果加上红色框里边的内容,问题1里边的数据集就不出来了。如果注释掉红色框里的内容,报表的数据源就可以出来。是什么问题?怎么解决?
解决方案
解决方案二:
你写存储过程要返回类似dataset或是datatable才行;你update的话那是更新数据,返回的是影响行数。
解决方案三:
所以你想更新的话,把你的更新语句放到查询语句的上面,就可以了。
解决方案四:
如果你的SQL是2005及以上版本可以改用表变量代代替临时表
解决方案五:
1楼,我更新语句下方还有个查询语句呀。查询语句返回的就是dataset或是datatable。
解决方案六:
引用4楼nyyb2008的回复:
1楼,我更新语句下方还有个查询语句呀。查询语句返回的就是dataset或是datatable。
但是接下来你就使用update了。
解决方案七:
用表变量测试:ALTERPROCEDUREForTestASBEGIN--SETNOCOUNTONaddedtopreventextraresultsetsfrom--interferingwithSELECTstatements.SETNOCOUNTON;--InsertstatementsforprocedurehereDECLARE@tableTABLE([id][decimal](18,0),[loginName][nchar](20)NOTNULL,[realname][nchar](10)NOTNULL,[DepartmentId][decimal](18,0)NOTNULL,[Tel1][nchar](20)NULL,[Tel2][nchar](20)NULL,[Email][nchar](40)NULL,[DutyID][decimal](18,0)NOTNULL,[password][nchar](32)NOTNULL,[lastLoginTime][datetime]NULL,[lastOnlineTime][datetime]NULL)INSERTINTO@table(id,loginName,realname,DepartmentId,Tel1,Tel2,Email,DutyID,password,lastLoginTime,lastOnlineTime)SELECTid,loginName,realname,DepartmentId,Tel1,Tel2,Email,DutyID,password,lastLoginTime,lastOnlineTimeFROMdbo.UsersUPDATE@tableSETid=id*2SELECT*FROM@tableENDGO
解决方案八:
楼上,我是先创建临时表,在把查询的数据存放在临时表里边。然后在update更新。更新完了之后,还有个select* from#temp的查询语句。就算是改成selectYb_user_idfrom#temp也没用啊。但是把蓝色的注释了就好了
解决方案九:
引用7楼nyyb2008的回复:
楼上,我是先创建临时表,在把查询的数据存放在临时表里边。然后在update更新。更新完了之后,还有个select* from#temp的查询语句。就算是改成selectYb_user_idfrom#temp也没用啊。但是把蓝色的注释了就好了
理论上来说,那就没上面问题了。有一点提示你一下,在存储过程使用临时表,你在查询返回数据后要删除的DROPTABLE#temp
解决方案十:
OK,问题解决了。正如6楼兄弟说的那样。要把临时表改成表变量才可以。改了下图里边的一句话,(临时表改成表变量)果然就好了。不过不明白表变量是什么东西呀。。。。。
解决方案十一:
临时表在存储过程执行结束后就失效了,只能在存储过程内部用,不能查询之后返回结果集
解决方案十二:
10楼,临时表也可以返回结果集的哦。我在程序内部使用程序调用图片上的这个存储过程,就可以返回dataset数据集。我把它绑定在grideview里边显示呀。
解决方案十三:
有没有人可以帮助我,在不改变存储过程的情况下,将带有临时表的存储过程的数据集绑定到Report上?