dataset和DataReader的困惑

红皮猴 2006-09-14 10:54:40
1:我有一存储过程能返回3个内容
1:能返回查询到的内容(select * from aa .......)
2:还能返回数据的总条数(@Counts int out)
3:还有RETURN值

用SqlDataAdapter来执行存储过程的话所有数据都能取到
用DataReader的话只能取到查询的内容,2和3都取不到
用ExecuteNonQuery的话1取不到2和3都能取到

为什么会这样呢,我想使用DataReader把3个内容都取到要怎么弄?



...全文
182 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
红皮猴 2006-09-14
  • 打赏
  • 举报
回复
没人遇到过吗
yusongkun 2006-09-14
  • 打赏
  • 举报
回复
帮楼主顶
红皮猴 2006-09-14
  • 打赏
  • 举报
回复
自己解决了,我的存储过程的确包含了2个结果集
dr = Sqlhelp.ExecuteReader(ProName, CommandType.StoredProcedure, Parms)
dr.NextResult()
Counts = Parms(7).Value
加个NextResult就可以了
红皮猴 2006-09-14
  • 打赏
  • 举报
回复
你的存储过程只有@rst这个返回值,其他的都是插入删除的
所以说是只有一个结果集(包含一个结果的)
fcuandy 2006-09-14
  • 打赏
  • 举报
回复
huigy(辉) ( ) 信誉:100 Blog 2006-09-14 14:38:00 得分: 0


你这个可以是因为你只产生一个结果集 如果不现在在里面加上返回查询信息的肯定有值取不到的

-------------

没看懂. 我的本来就没行集返回的
红皮猴 2006-09-14
  • 打赏
  • 举报
回复
Protected Sub GetResult()
Dim Parms As SqlParameter()
Dim dr As SqlDataReader
Dim conn As New SqlConnection(Sqlhelp.ConnectionString)
Dim comm As SqlCommand = New SqlCommand("User_Page_NOT_IN", conn)
Dim Counts, Pages As Integer
comm.CommandType = CommandType.StoredProcedure
Parms = New SqlParameter() _
{New SqlParameter("@Table", SqlDbType.VarChar, 50), _
New SqlParameter("@ID", SqlDbType.VarChar, 50), _
New SqlParameter("@collist", SqlDbType.VarChar, 200), _
New SqlParameter("@where", SqlDbType.VarChar, 200), _
New SqlParameter("@Sort", SqlDbType.VarChar, 100), _
New SqlParameter("@pagesize", SqlDbType.Int), _
New SqlParameter("@page", SqlDbType.Int), _
New SqlParameter("@Counts", SqlDbType.Int)}
Parms(0).Value = "aa"
Parms(1).Value = "ID"
Parms(2).Value = "*"
Parms(3).Value = " "
Parms(4).Value = "ID desc"
Parms(5).Value = 30
Parms(6).Value = 3
Parms(7).Direction = ParameterDirection.Output
For i As Integer = 0 To Parms.Length - 1
comm.Parameters.Add(Parms(i))
Next
conn.Open()
dr = comm.ExecuteReader
Counts = comm.Parameters("@Counts").Value
If Counts <= 30 Then
Pages = 1
Else
Pages = (Counts + 30 - 1) / 30
End If
Label1.Text = Counts
Label2.Text = Pages
FList.DataSource = dr
FList.DataBind()
End Sub

结果是FList里面显示了数据
Label1.Text和Label2.Text没数据
反过来如果用dataset的话就全部有数据
红皮猴 2006-09-14
  • 打赏
  • 举报
回复
你这个可以是因为你只产生一个结果集 如果不现在在里面加上返回查询信息的肯定有值取不到的
fcuandy 2006-09-14
  • 打赏
  • 举报
回复
comm.Parameter("@Counts").value是object类型,int 是值类型 需要强制转换,. 你可能用了 try catch,所以没有报错.
fcuandy 2006-09-14
  • 打赏
  • 举报
回复
贴你的存储过程出来看看.
红皮猴 2006-09-14
  • 打赏
  • 举报
回复
我看了两个返回值的确在dr(0)和dr(1)里面,但是为什么用comm.Parameter("@Counts").value
取不到值呢
fcuandy 2006-09-14
  • 打赏
  • 举报
回复
自己不会取,要说取不到,没有语言.
刚刚写WEB SERVICE时写的一段
Ws_IpLog 记录了访问IP和访问时间,用作限制访问时间时隔
sturc:
Ws_ID int identity,Ws_Ip varchar(20),Ws_Time datetime default GETDATE

CREATE PROC Ws_Log
(@ip VARCHAR(20),
@time int,
@rst int OUTPUT
)
AS
BEGIN
IF EXISTS(SELECT 1 FROM Ws_IpLog WHERE WI_IP=@ip AND DATEDIFF(n,WI_Time,GETDATE())<@time)
SET @rst=1
ELSE
BEGIN
IF EXISTS(SELECT 1 FROM Ws_IpLog WHERE WI_IP=@ip)
UPDATE Ws_IpLog SET WI_Time=GETDATE() WHERE WI_IP=@ip
ELSE
INSERT Ws_IpLog (WI_IP) SELECT @ip
SET @rst=0
END
END

public static int Rst(string ip,int tm)
{
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "Ws_Log";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = ICon.Cnn;
SqlParameter parm = cmd.Parameters.Add("@ip", System.Data.SqlDbType.VarChar,20);
parm.Value = ip;
parm = cmd.Parameters.Add("@time", System.Data.SqlDbType.Int,8);
parm.Value = tm;

cmd.Parameters.Add("@rst", System.Data.SqlDbType.Int, 8);
cmd.Parameters["@rst"].Direction = ParameterDirection.Output;

SqlDataReader dr = cmd.ExecuteReader();
int i = 0;
i = Int32.Parse(cmd.Parameters["@rst"].Value.ToString());
return i;
}

只不过我的存储过程没有返回记录集而已.
你自己加个 select * from ws_iplog在存储过程里.然后在 Rst方法中 用 while(dr.read())看看能否取到这些
红皮猴 2006-09-14
  • 打赏
  • 举报
回复
获取了但是里面没什么信息
yuchangmao 2006-09-14
  • 打赏
  • 举报
回复
dr.GetValue(0).ToString()应该能取到2\3项的值
q_po_o 2006-09-14
  • 打赏
  • 举报
回复
DataTable dTable = myReader.GetSchemaTable();


dTable里包含了 架构信息
红皮猴 2006-09-14
  • 打赏
  • 举报
回复
那么说DataReader不可以同时取out值和查询值了?
dick78 2006-09-14
  • 打赏
  • 举报
回复
或者返回串:select * from aa .......;select @Counts ;select @Ret
其中@Ret是return的数值。这样DataReader可以得到三个结果集。然后分别处理即可。
dick78 2006-09-14
  • 打赏
  • 举报
回复
用存储过程的返回参数可以。

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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