2011-06-24 48 views
0

我有这样的SQL: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:电子邮件 我已经检查了SQL被正确exucuted。我发布的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

为什么你不试一试列索引而不是列名,这可能会帮助你。 –

+0

你能发布一个示例输出(来自SQL)吗? – StevieG

回答

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到第3集将从SELECT * FROM users WHERE id = @sid ORDER By ID DESC

+0

我是否在第一个r.Read while循环中调用r.ReadNext或不在? – YsoL8

+0

之前第一次,看编辑 –

+0

干杯,它很棒 – YsoL8

0

包含的数据据我可以理解你想执行多个语句,对不对?
您应该用分号分隔SQL语句,并在完成之前的one时更改阅读器。

UPDATE:

我通常使用存储过程和计数器返回参数。 类似这样的:

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 
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")) 

另外一个可能的解释(再次,不清楚)就是你搞砸了你的第一个列名(“邮件”),这也给了超出范围的异常。