dataTable作为Function的参数

时间:2013-09-19 15:00:17

标签: .net sql-server vb.net ado.net

我有SQL SP用于在VB中填充DataTables以及用VB填充列表框/图表等。在VB中我试图使用OOP,因此使用类变量。在VB中我有一个函数,用于使用SP提取数据的代码,这个函数我想在每次拉数据时使用,所以每次不同的数据请求都会向函数发送不同的输入,参数。

我可以为整数数据类型的输入参数实现这一点,但我仍然坚持为DataTable类型做同样的事情。如果我可以,我想使用相同的DataTable,但是当你再次运行该函数来填充另一个容器(列表框,然后是图表等)时,第一个容器会丢失它的数据并且为空,因为DataTable加载了新数据。在第一个数据集用于填充第一个容器之后,这是当前的。这让我认为DataTable有一个“永久”链接到容器以保持其填充?

这导致我尝试声明多个DataTable并为每个容器传递一个不同的DataTable。在这里,我得到了声明和传递DataTable类型的问题。任何解决这个问题的方法?另一个问题是,是否可以拥有一个DataTable类?我使用MS SQL Server 2012& MS Visual Studio 2010。

这就是我填充DataTable的功能:

Public Function outputData(ByVal beg_Date, ByVal end_Date, ByVal ID1, ByVal proC, ByRef dDataTable)
    If conn.State = ConnectionState.Open Then pData.Clear()

    SQLcomm = New SqlClient.SqlCommand(proC, conn)
    SQLcomm.CommandType = CommandType.StoredProcedure
    SQLcomm.Parameters.AddWithValue("@begDate", SqlDbType.Date).Value = beg_Date
    SQLcomm.Parameters.AddWithValue("@endDate", SqlDbType.Date).Value = end_Date
    SQLcomm.Parameters.AddWithValue("@ID1", SqlDbType.Int).Value = ID1


    aDapter.SelectCommand = SQLcomm
    aDapter.Fill(dDataTable)

    Return pData

End Function

proC是SQL过程参数,dDataTable是DataTable参数。任何提示将不胜感激。

谢谢,

1 个答案:

答案 0 :(得分:2)

只需从此功能中返回一个新的DataTable,即可让您的生活更轻松。考虑一下:

Public Function outputData(ByVal beg_Date, ByVal end_Date, ByVal ID1, ByVal proC)
    SQLcomm = New SqlClient.SqlCommand(proC, conn)
    SQLcomm.CommandType = CommandType.StoredProcedure
    SQLcomm.Parameters.AddWithValue("@begDate", SqlDbType.Date).Value = beg_Date
    SQLcomm.Parameters.AddWithValue("@endDate", SqlDbType.Date).Value = end_Date
    SQLcomm.Parameters.AddWithValue("@ID1", SqlDbType.Int).Value = ID1

    Dim dt As New DataTable()
    aDapter.SelectCommand = SQLcomm
    aDapter.Fill(dt)

    Return dt
End Function

您不会在消费者之间重复使用DataTable个对象,因为是的,它们是引用类型,所以当您更改它们时,它就结束了。现在,如果您需要刷新DataTable,那么您在其他地方存储了一个新查询,现在您所要做的就是:

myCurrentDataTable = outputData(...)

最后,在使用SqlConnectionSqlDataAdapterSqlCommand类时,不要共享它们。每次需要时都会创建新的将它们包装在Using语句中,如下所示:

Using conn As New SqlConnection(cString)
    Using aDapter As New SqlDataAdapter(...)
        ' and so on
    End Using
End Using