我有这个SQL:
SELECT count (1) FROM users AS total_drafts WHERE version_replace = @sid
SELECT count (1) AS unpublished_drafts FROM users WHERE version_replace = @sid AND moderated = 0
SELECT * FROM users WHERE id = @sid ORDER By ID DESC
这似乎是正确的。但是我很难从结果中提取字段。在vb.net中,我正在使用此代码片段:
While r.Read()
Dim o_email As String = CStr(r("email"))
Dim o_first_name As String = CStr(r("first_name"))
Dim o_last_name As String = CStr(r("last_name"))
导致此错误: System.IndexOutOfRangeException:email 我已经检查过sql正在被正确执行。我发布的sql只是简单地替换了一个更简单的语句,该语句完美地填充了代码片段。
为什么会这样,我该如何纠正?
正确的方法:
While r.Read()
total_drafts = CInt(r("total_drafts"))
End While
r.NextResult()
While r.Read()
unpublished_drafts = CInt(r("unpublished_drafts"))
End While
error_status.Text = total_drafts & " " & unpublished_drafts
r.NextResult()
While r.Read()
Dim o_email As String = CStr(r("email"))
Dim o_first_name As String = CStr(r("first_name"))
Dim o_last_name As String = CStr(r("last_name"))
答案 0 :(得分:1)
编辑:r.NextResult()
代替r.ReadNext()
,r.ReadNext()
代表DataTableReader
假设您一次调用整个sql语句,问题是r.Read()
将使用为第一个语句(SELECT count (1) FROM users AS total_drafts WHERE version_replace = @sid
)返回的第一个数据表,该数据表不包含该电子邮件等领域。
您必须两次调用r.NextResult()
,这会将datareader移动到包含SELECT * FROM users WHERE id = @sid ORDER By ID DESC
答案 1 :(得分:0)
据我所知,你正试图执行多个陈述,对吧? 您应该用分号分隔SQL语句,并在完成上一个one后更改阅读器。
更新:
我通常使用存储过程并返回计数器的参数。 像这样:
CREATE PROCEDURE usp_GetUsers (@sid INT, @unpublished INT OUTPUT)
AS
BEGIN
DECLARE @total_drafts INT
DECLARE @unpublished_drafts INT;
SELECT @total_drafts = count (1) FROM users WHERE version_replace = @sid
SELECT @unpublished_drafts = count (1) FROM users WHERE version_replace = @sid AND moderated = 0
SELECT * FROM users WHERE id = @sid ORDER By ID DESC
RETURN(@total_drafts)
END
答案 2 :(得分:0)
您正在返回三个数据集。如果“r”是DataReader(从您的问题中不清楚)那么您需要调用;
r.NextResult
你的代码行之间的,就像这样;
While r.Read()
Dim o_email As String = CStr(r("email"))
r.NextResult()
Dim o_first_name As String = CStr(r("first_name"))
r.NextResult()
Dim o_last_name As String = CStr(r("last_name"))
另一个可能的解释(再次,不清楚)是你搞砸了你的第一个列名(“email”),这也会导致超出范围的异常。