2014-01-16 57 views
1

我想要一个循环查询结果并将它们显示在Visual Basic的列表框中的代码。到目前为止我所拥有的是一个存储过程,一个列表框和一个按钮。Visual Basic循环查询结果

存储过程IM调用被称为“CycleCustomers”和在SQL如下:

ALTER PROCEDURE CycleCustomers 
-- Add the parameters for the stored procedure here 
@p1 int 

    AS 
    BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

-- Insert statements for procedure here 
SELECT FirstName from tblCustomer where CustomerId = @p1 
END 

上按一下按钮的代码,我有如下

Dim dc = New DataTestDataContext 
    Dim DealerCount As Int32 
    DealerCount = 0 
    ListBox2.Items.Clear() 

    Do Until DealerCount = 10 
     dc.CycleCustomers(DealerCount) 
     ListBox2.Items.Add(dc.CycleCustomers(DealerCount).ReturnValue) 
     DealerCount = DealerCount + 1 
    Loop 

当按钮被点击,我的列表框返回10个零。我究竟做错了什么?提前致谢。

编辑:这里是CYCLECUSTOMERS功能

<FunctionAttribute(Name:="dbo.CycleCustomers")> _ 
Public Function CycleCustomers(<Parameter(DbType:="Int")> ByVal p1 As System.Nullable(Of Integer)) As ISingleResult(Of CycleCustomersResult1) 
    Dim result As IExecuteResult = Me.ExecuteMethodCall(Me, CType(MethodInfo.GetCurrentMethod,MethodInfo), p1) 
    Return CType(result.ReturnValue,ISingleResult(Of CycleCustomersResult1)) 
End Function 
+0

向我们展示“CycleCustomers”方法以了解其工作原理。 – user2989408

+0

你通常有一个'SELECT'查询并通过使用'DataReader'循环。 – Neolisk

+0

CycleCustomers是一个存储过程,我把它的代码第一个 – Zingo

回答

2

看一看这里:http://msdn.microsoft.com/en-us/library/bb534556(v=vs.110).aspx

你所取回的类型是CycleCustomerResult1,这是一个IEnumerable的ISingleResult。你应该能够使用LINQ做的是一样的东西:

Dim dc = New DataTestDataContext 
Dim DealerCount As Int32 
DealerCount = 0 
ListBox2.Items.Clear() 

Do Until DealerCount = 10 
    Dim Customer = dc.CycleCustomers(DealerCount).SingleOrDefault() 

    If (Not(Customer Is Nothing)) 
    ListBox2.Items.Add(Customer.FirstName) 
    End If 

    DealerCount = DealerCount + 1 

Loop 

我没有Visual Studio中的时刻进行检查:还我一般使用C#,所以我的VB的精度可能是穷人。

但是,无论如何,你采取的方法似乎非常非正统。理想情况下,您将有一个存储过程返回一组行,然后遍历该结果,并添加到列表框中。

因此,例如,一个存储过程是这样的:

ALTER PROCEDURE CycleCustomers 
    AS 
    BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

-- Insert statements for procedure here 
SELECT FirstName from tblCustomer 
END 

那么功能更喜欢这个

Dim Customers = dc.CycleCustomers() 

For Each Customer In Customers 
    ListBox2.Items.Add(Customer.FirstName) 
Next 
0

好吧,我做到了通过LINQ to SQL和存储过程,但现在的工作。下面是按钮

Dim number As Int32 
    number = 1 
    Dim dc = New DataTestDataContext 

    Do Until number > dc.MaxCustomerId.First.CustomerId 
     Dim Customers = From cust In dc.CycleCustomers(number) _ 
         Where cust.CustomerId = number _ 
         Select cust 

     For Each cust In Customers 
      ListBox2.Items.Add(cust.FirstName) 

     Next 
     number = number + 1 
    Loop 

代码这里是存储过程的代码

ALTER PROCEDURE CycleCustomers 
-- Add the parameters for the stored procedure here 
@p1 int 

    AS 
    BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

-- Insert statements for procedure here 
SELECT CustomerId, FirstName from tblCustomer where CustomerId = @p1 
END 

我做了另一个存储过程的循环,它选择最大的ID号,它的代码是在这里

ALTER PROCEDURE MaxCustomerId 

AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

    SELECT CustomerId 
    FROM tblCustomer 
WHERE CustomerId=(SELECT max(CustomerId) FROM tblCustomer) 

END