1

私は、VB で DataTables を作成するために使用する SQL SP と、VB 形式でリストボックス/チャートなどを埋めるために使用する SQL SP を持っています。VB では、OOP を使用しようとしているため、変数にクラスを使用しています。VBには、SPを使用してデータをプルするコードを含む関数があります。この関数は、データをプルするたびに使用したいので、異なるデータ要求ごとに、異なる入力、パラメーターを関数に送信します。

整数データ型の入力パラメーターに対してこれを実現できますが、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 パラメータです。ヒントをいただければ幸いです。

ありがとうございました、

4

1 に答える 1

2

DataTableこの関数からnew を返すだけで、作業がずっと楽になります。このことを考慮:

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(...)

最後に、、、およびクラスを使用する場合はSqlConnectionそれらを共有しないでください。必要なたびに新しいものを作成し、次のようにステートメントでラップします。SqlDataAdapterSqlCommandUsing

Using conn As New SqlConnection(cString)
    Using aDapter As New SqlDataAdapter(...)
        ' and so on
    End Using
End Using
于 2013-09-19T15:05:46.277 に答える