2

一般的なクエリ実行関数を作成しようとしています。クエリ文字列を送信して、結果を含む2次元配列を返すようにしたいです。以下は、(9、x)配列でそれを行う方法の私のコードです。(y、x)サイズの配列でそれを行うにはどうすればよいですか?また、これを行うにはもっと効率的な方法があるはずだと思います...

   Dim right As Integer = 0
    dbConn = New SqlConnection("hidden for security purposes")
    MyCommand = New SqlCommand(queryString, dbConn)
    dbConn.Open()
    Dim resultArray(9, 0) As String
    MyDataReader = MyCommand.ExecuteReader()

    While (MyDataReader.Read())
        For i = 0 To 9
            If IsDBNull(MyDataReader(i)) Then
                'resultArray(i, UBound(resultArray, 2)) = ""
            Else
                resultArray(i, UBound(resultArray, 2)) = MyDataReader(i)

            End If
        Next

        ReDim Preserve resultArray(9, UBound(resultArray, 2) + 1)
    End While
    ReDim Preserve resultArray(9, UBound(resultArray, 2) - 1)
    MyDataReader.Close()
    dbConn.Close()

Return resultArray
4

3 に答える 3

2

次のようなものを試してください。

Public Function GetData(ByVal queryString As String, ByVal addParameters As Action(Of SqlParameterCollection) As DataTable
    Dim result As New DataTable()
    Using cn As New SqlConnection(" connection string "), _
          cmd As New SqlCommand(queryString, cn)

       addParameters(cmd.Parameters)

       cn.Open()
       Using rdr As SqlCommand.ExecuteReader()
          result.Load(rdr)
       End Using
   End Using
   Return result
End Function

パラメータのないクエリの場合は、次のように呼び出します。

Dim result = GetData("Select * from Table", Sub(p) Exit Sub)

または、パラメータがある場合:

Dim result = GetData("Select * from Table Where ID= @ID", _
    Sub(p)
        p.Add("@ID", SqlDbType.Int).Value = 12345
    End Sub)
于 2012-06-11T15:03:53.800 に答える
0

これは悪い考えですが、これを行う必要がある場合は、配列の代わりにデータセットを返すことをお勧めします。

Private Function getDataSet(ByVal queryString As String) As DataSet
    Dim data As New DataSet()
    Using dbConn As New SqlConnection("hidden for security purposes")
        dbConn.Open()
        Using MyCommand As New SqlCommand(queryString, dbConn)
            Using adapter As New SqlDataAdapter(MyCommand)
                adapter.Fill(data)
            End Using
        End Using
    End Using
    Return data
End Function

データセットが必要ない場合は、データセットの最初のテーブルのみを返すことができます(これは基本的にデータの2D配列ですが、より多くの機能とメタデータを備えています)。

Private Function getDataTable(ByVal queryString As String) As DataTable
    Dim data As New DataSet()
    Using dbConn As New SqlConnection("hidden for security purposes")
        dbConn.Open()
        Using MyCommand As New SqlCommand(queryString, dbConn)
            Using adapter As New SqlDataAdapter(MyCommand)
                adapter.Fill(data)
            End Using
        End Using
    End Using
    Return data.Tables(0)
End Function

または、文字列の2D配列が必要な場合でも、データセットを内部的に入力し、それを配列に変換することで、より簡単に行うことができます。

Private Function getDataArray(ByVal queryString As String) As String()()
    Dim rows As List(Of String()) = New List(Of String())
    Using dbConn As New SqlConnection("hidden for security purposes")
        dbConn.Open()
        Using MyCommand As New SqlCommand(queryString, dbConn)
            Using adapter As New SqlDataAdapter(MyCommand)
                Dim data As New DataSet()
                adapter.Fill(data)
                For Each row As DataRow In data.Tables(0).Rows
                    Dim items(row.ItemArray.Length) As String
                    For i As Integer = 0 To row.ItemArray.Length - 1
                        items(i) = row.ItemArray(i).ToString()
                    Next
                    rows.Add(items)
                Next
            End Using
        End Using
    End Using
    Return rows.ToArray()
End Function
于 2012-06-11T15:02:57.317 に答える
0

リストを使用し、xとyを交換する方が簡単で効率的です。

Dim result = new List(Of String())

リストは自動的に大きくなります。

While (MyDataReader.Read())
    Dim row = new String(MyDataReader.FieldCount - 1)
    For i = 0 To MyDataReader.FieldCount - 1
        row(i) = MyDataReader(i).ToString()
    Next
    result.Add(row)
End While
于 2012-06-11T15:08:35.803 に答える