SQL从具有多个选择的语句中检索值

时间:2011-06-24 08:48:46

标签: sql vb.net select

我有这个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"))

3 个答案:

答案 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

数据的第3个数据集

答案 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”),这也会导致超出范围的异常。