Visual Studio DataSet选择存储过程为何看不到结果字段? ( 积分: 100 )

D

DF7C3

Unregistered / Unconfirmed
GUEST, unregistred user!
Visual Studio DataSet选择存储过程为何看不到结果字段?
在建立数据源的时候,有一步是选择数据集中包含哪些对象。
我选中存储过程S1, 并且点S1的treeview节点前面的十字来展开这个节点,
节点展开后应该出现这个过程执行后返回的数据集的字段, 但是什么都不出。
于是我又写了一个很简单的存储过程S2,
这个S2包括只包括一个很简单的select语句,
在我重复和S1同样的操作的时候,这个S2的字段就能被列出来。
请问这是怎么回事?难道studio在为DataSet选择数据库对象的时候,
对于存储过程的编写方法有什么特殊的要求吗?
同样是返回结果集的存储过程,为什么有的存储过程的字段可以选出来,有的不行?
我遇到的问题有什么解决办法吗?谢谢!
 
临时表在存储过程结束前一定要把数据转移出来,当存储过程执行完毕时,临时表自动释放
 
呵呵,简单问题。
你创建的肯定是局部临时表#table,如果创建的是全局临时表##table就没事了。
问题的本质是,当某个连接断时,通过该连接创建的局部临时表将自动释放,
而全局临时表不会,全局临时表只有当所有连接都断掉时,它才自动释放。
如果不用临时表,那就不存在释放不释放的问题,所以当然没问题了。
以上就是理论上的解释,呵呵。
 
TO:lisongmagic
理论说的满好的,不知道楼主是否按照此解决问题了。
 
我照着lisongmagic说的办法作了,可是还是不行。
 
存储过程中可以用临时表,我用过的;
你调用存储过程的那个连接和创建临时表的那个连接是一个连接吗?
如果不是那不行,你要确保他们是一个连接,共享一个连接
 
我现在倒是可以选出来了,但是必须像下面这样写。
如果没有那句 select '0123456789' as F1 就还是出不来。
但我觉得这是一种投机取巧的方式,并没有真正理解的解决这个问题,
有没有其他的在理论上能讲出道理的解决方法?
CREATE PROCEDURE [dbo].[TestForStudio]
AS
select '0123456789' as F1
CREATE TABLE [dbo].[#T] (F1 varchar(10) NULL)
select * from #T
 
CREATE PROCEDURE [dbo].[TestForStudio]
AS
select '0123456789' as F1
CREATE TABLE [dbo].[#T] (F1 varchar(10) NULL)
select * from #T
这什么意思啊,我自己的理解是:
CREATE PROCEDURE [dbo].[TestForStudio]
AS
select * from #T
if not exsit(....) then
CREATE TABLE [dbo].[#T] (F1 varchar(10) NULL)
insert into talbe [dbo].[#T] values ...
你创建的得是一个返回结果集的存储过程.
而下面这样肯定不行
CREATE PROCEDURE [dbo].[TestForStudio]
AS
if not exsit(....) then
CREATE TABLE [dbo].[#T] (F1 varchar(10) NULL)
insert into talbe [dbo].[#T] values ...
 
我刚才的写法就是返回一个数据集呀。
select '0123456789'as F1 这句就是先选出一个"假"字段,
以便在建立DataSet的时候,能把字段选出来。
如果按照你的写法,等于在#T还未创建的时候就去select它,会不会出错?
CREATE PROCEDURE [dbo].[TestForStudio]
AS
select * from #T
if not exsit(....) then
CREATE TABLE [dbo].[#T] (F1 varchar(10) NULL)
insert into talbe [dbo].[#T] values ...
 
哦,不好意思,手忙脚乱,写错了
CREATE PROCEDURE [dbo].[TestForStudio]
AS
if not exsit(....) then
CREATE TABLE [dbo].[#T] (F1 varchar(10) NULL)
insert into talbe [dbo].[#T] values ...
select * from #T //放在后面
这是返回结果集的,调用时用adoquerty.open;
如果不是返回结果集的,调用时用execSql;
 
我的存储过程就是像你说得 select * from #T 放在后面 那样写的呀。
adoquerty.open?! 如果不是返回结果集的,调用时用execSql?!
你说的是Delphi吧,我说的是在VS2005里面。
 
那应该都一样吧,delphi,c#都是一个人架构的.
至于c#在调用存储过程时有无特殊的地方,小弟不大清楚,呵呵
 
起码在我说的这个问题上完全不是一回事。
 
CREATE PROCEDURE [dbo].[TestForStudio]
AS
if not exsit(....) then
CREATE TABLE [dbo].[#T] (F1 varchar(10) NULL)
insert into talbe [dbo].[#T] values ...
GO //在这里加个Go
select * from #T //放在后面
Go//在这里加个Go
加两个Go试试
 
不行,第一个go加上了会有语法错误的,仅有第二个go到时可以执行,
但是也选出不来字段。
 
CREATE PROCEDURE [dbo].[TestForStudio]
AS
if not exsit(....) then
CREATE TABLE [dbo].[#T] (F1 varchar(10) NULL)
insert into talbe [dbo].[#T] values ...
select 'abc' //你试试这会不会错
Go //在这里加个Go
加两个Go试试
 
你写的其实就是我刚才的写法:
来自:DF7C3, 时间:2007-3-30 16:43:58, ID:3693133 | 编辑
CREATE PROCEDURE [dbo].[TestForStudio]
AS
select '0123456789' as F1
CREATE TABLE [dbo].[#T] (F1 varchar(10) NULL)
select * from #T
 
不好意思,我说错了,我以前做的是查询临时表,不是创建临时表;
我刚才在查询分析器里试了一下,不能在存储过程中建立临时表,
sql语句执行不会报错,但是它根本没有建立这个临时表.
具体原因我不大清楚,帮不了忙
 
不好意思,你的问题我现在彻底的清楚了,
这次打包票搞定你的问题。
1 必须建立的是全局临时表,必须##,因为在查询分析器里一次操作是一个连接,该操作完 毕即断开连接,所以必须是全局临时表
2 你的错误是没有执行该存储过程,你只创建存储过程,但没有执行,所以不可能有数据
参考我下面的:
步骤1:
if exists(select name from sysobjects where name = 'lisongmagic'and type = 'p')
drop procedure lisongmagic
go
create procedure lisongmagic
as
if exists( select id from tempdb.dbo.sysobjects where id = object_id('tempdb.dbo.'+'##abc'))
drop table ##abc
create table ##abc
(
name varchar(50) null
)
insert into ##abc(name)values('lisongmagic')
步骤2:
exec lisongmagic
select * from ##abc
 
你还是没有理解我的问题。
我并不是要通过一个存储过程把记录插入到一个临时表里,然后再把这个临时表选出来。
而是要在一个存储过程里就把最后的要的结果显示出来。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
823
DelphiTeacher的专栏
D
D
回复
0
查看
795
DelphiTeacher的专栏
D
D
回复
0
查看
871
DelphiTeacher的专栏
D
顶部