-1

複数のレコードセットを返すストアド プロシージャがあります。1 つのレコードセット、2 つのレコードセット、またはそれ以上にすることができます。RSが何人戻ってくるかわかりません。

ここstackoverflowで、以下のサンプルを見つけました

    Dim conn As New SqlConnection(ConfigurationManager.ConnectionStrings("myConnection").ConnectionString)
    Dim cmd As New SqlCommand
    Dim Reader As SqlDataReader
    cmd.Connection = conn
    cmd.Parameters.AddWithValue("@ACTNbr", tbACTNbr.Text.ToString.Trim)
    cmd.Parameters.AddWithValue("@WTHNbr", tbWTHNbr.Text.ToString.Trim)
    cmd.CommandText = "sp_search_def"
    cmd.CommandType = CommandType.StoredProcedure
    conn.Open()
    Reader = cmd.ExecuteReader()
'The next part is what I found here at stackoverflow
While Reader.Read() OrElse (Reader.NextResult() And Reader.Read())
  For i As Integer = 0 To Reader.FieldCount - 1
    Response.Write(Reader(i).ToString())
    Response.Write(" ")
  Next
  Response.Write("<br />")
End While

上記response.writeは、私が完全に必要とするデータを示しています。しかし、それをGridviewに入れる必要があります。つまり、ストアド プロシージャの結果 (およびそのすべての結果セット) を 1 つのグリッドビューに配置する必要があります。

私のグリッドビューはに設定されていAutoGenerateColumns = "true"ます。

私はもう試した:

myGridview.DataSource = Reader
myGridview.DataBind()

もちろん、レコードセットは 1 つしか取得できません。

ストアド プロシージャの結果はすべて同じ形式 (同じ数の列、ヘッダーなど) にフォーマットされます。

誰かが私を正しい方向に向けることができますか? 私はこれを理解しようとしてきましたが、あきらめて、今ここで尋ねています。

私はこれが初めてです。

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

4

4 に答える 4

1

GridView は 1 つの結果セットにのみバインドできます。たとえば、 を複数の DataTable を含む にバインドするGridViewDataSet最初 DataTableの のデータのみが表示されます。

proc によって返されるすべての結果セットは同じスキーマを持っているため、それらをマージして、結果セットを にバインドする必要がありますGridView

例:

//Assumes your proc returns a dataset with more than one datatable
//Notice how all datables are merged into the first one [0]
for (int i = 1; i < ds.Tables.Count; i++)
{
    ds.Tables[0].Merge(ds.Tables[i]);  
}

grid.DataSource = ds;
grid.DataBind();

または同等:

grid.DataSource = ds.Tables[0];//this DT has everything
grid.DataBind();

グリッドには、すべてのデータテーブルのすべての行が表示されます

DataTable のスキーマが異なる場合、マージされた DataTable にはすべての DataTable のすべての列が含まれます。

たとえば、呼び出さDataTableれた列を持つ a を、呼び出された列をCol1持つ別の列とマージすると、次のようになります。DataTableCol2

  +-----+------+
  |Col1 | Col2 |
  ------+------+
  |val1 |  null|
  +-----+------+
  |null |  val2|
  +-----+------+
于 2012-08-20T14:37:12.057 に答える
1

以下に示すように、 DataAdapter を使用して、 DataReader の代わりに DataSet を入力します。これにより、グリッドビューに簡単にバインドできます。

    Dim DS As DataSet
    Dim MyConnection As SqlConnection
    Dim MyDataAdapter As SqlDataAdapter

    'Create a connection to the SQL Server.
    MyConnection = New SqlConnection("server=(local);database=pubs;Trusted_Connection=yes")

    'Create a DataAdapter, and then provide the name of the stored procedure.
    MyDataAdapter = New SqlDataAdapter("GetAuthorsByLastName", MyConnection)

    'Set the command type as StoredProcedure.
    MyDataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure

    'Create and add a parameter to Parameters collection for the stored procedure.
    MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@au_lname", _
   SqlDbType.VarChar, 40))

    'Assign the search value to the parameter.
    MyDataAdapter.SelectCommand.Parameters("@au_lname").Value = Trim(txtLastName.Text)

    'Create and add an output parameter to Parameters collection. 
    MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@RowCount", _
    SqlDbType.Int, 4))

    'Set the direction for the parameter. This parameter returns the Rows returned.
    MyDataAdapter.SelectCommand.Parameters("@RowCount").Direction = ParameterDirection.Output

    DS = New DataSet() 'Create a new DataSet to hold the records.
    MyDataAdapter.Fill(DS, "AuthorsByLastName") 'Fill the DataSet with the rows returned.

    'Get the number of rows returned, and then assign it to the Label control.
    'lblRowCount.Text = DS.Tables(0).Rows.Count().ToString() & " Rows Found!"
    lblRowCount.Text = MyDataAdapter.SelectCommand.Parameters(1).Value & " Rows Found!"

    'Set the data source for the DataGrid as the DataSet that holds the rows.
    Grdauthors.DataSource = DS.Tables("AuthorsByLastName").DefaultView

    'Bind the DataSet to the DataGrid. 
    'NOTE: If you do not call this method, the DataGrid is not displayed!
    Grdauthors.DataBind()

    MyDataAdapter.Dispose() 'Dispose of the DataAdapter.
    MyConnection.Close() 'Close the connection.

Visual Basic .NET を使用して ASP.NET で SQL Server ストアド プロシージャを呼び出す方法

于 2012-08-20T13:46:41.560 に答える
0

@Kapil と @Icarus の返信を使用して、これを機能させることができました。お時間を割いていただきありがとうございます。それは私を正しい方向に向けました。

これは私が最終的に得たものです:

  Protected Sub btnSearch_Click(sender As Object, e As System.EventArgs)
    Dim DS As DataSet
    Dim MyConnection As SqlConnection
    Dim MyDataAdapter As SqlDataAdapter
    Dim msg As String = ""

    'Create a connection to the SQL Server.
    MyConnection = New SqlConnection(ConfigurationManager.ConnectionStrings("msSQLdb").ConnectionString)

    'Create a DataAdapter, and then provide the name of the stored procedure.
    MyDataAdapter = New SqlDataAdapter("sp_search_all_SQLservers", MyConnection)

    'Set the command type as StoredProcedure.
    MyDataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure

    'Create and add a parameter to Parameters collection for the stored procedure.
    MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@ACTNbr", SqlDbType.VarChar, 10))
    MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@WTHNbr", SqlDbType.VarChar, 15))

    'Assign the search value to the parameter.
    MyDataAdapter.SelectCommand.Parameters("@ACTNbr").Value = tbACTNbr.Text.ToString.Trim
    MyDataAdapter.SelectCommand.Parameters("@WTHNbr").Value = tbWTHNbr.Text.ToString.Trim

    'Create a new DataSet to hold the records.
    DS = New DataSet()
    'Fill the DataSet with the rows returned.
    MyDataAdapter.Fill(DS, "proc_results")

    'Set the data source for the gridview as the DataSet that holds the rows.
    gv.DataSource = DS.Tables("proc_results").DefaultView
    For i = 1 To DS.Tables.Count - 1
      DS.Tables(0).Merge(DS.Tables(i))
    Next

    msg = DS.Tables(0).Rows.Count & " rows found"
    gv.Caption = DS.Tables(0).Rows.Count & " rows found"
    gv.DataSource = DS

    'Bind the DataSet to the DataGrid. 
    'NOTE: If you do not call this method, the DataGrid is not displayed!    
    gv.DataBind()
    If gv.Rows.Count <> 0 Then
      gv.Visible = True
    Else
      msg = "No data found"
    End If

    MyDataAdapter.Dispose() 'Dispose of the DataAdapter.
    MyConnection.Close() 'Close the connection.
    DS.Dispose()
    lblMsg.Text = msg
  End Sub
于 2012-08-23T14:48:24.220 に答える
0

DataTable にバインドする必要があります。DataSet は複数のテーブルを保持できます。

DataSet.Tables プロパティ

于 2012-08-20T14:15:10.147 に答える