Как я могу прочитать несколько таблиц в наборе данных?
У меня есть хранимая процедура, которая возвращает несколько таблиц. Как я могу выполнить и прочитать обе таблицы?
У меня есть что-то вроде этого:
SqlConnection conn = new SqlConnection(CONNECTION_STRING);
SqlCommand cmd = new SqlCommand("sp_mult_tables",conn);
cmd.CommandType = CommandType.StoredProcedure);
IDataReader rdr = cmd.ExecuteReader();
Я не уверен, как это читать... Каков наилучший способ обработки этого типа запроса, я думаю, я должен прочитать данные в DataSet? Как лучше всего это сделать?
Благодарю.
4 ответа
Адаптировано из MSDN:
using (SqlConnection conn = new SqlConnection(connection))
{
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = new SqlCommand(query, conn);
adapter.Fill(dataset);
return dataset;
}
Читатель будет иметь дело с наборами результатов в возвращенном порядке; когда закончите обработку первого набора результатов, вызовите rdr.NextResult(), чтобы установить следующий
Также обратите внимание, что адаптер таблицы будет автоматически считывать все результирующие наборы в таблицы в наборе данных при заполнении, но таблицы данных будут иметь нетипизированный тип с именем Table1, Table2 и т. д.
Если вы хотите прочитать результаты в DataSet, вам лучше использовать DataAdapter.
Но с помощью DataReader сначала выполните итерацию по первому набору результатов, а затем вызовите NextResult, чтобы перейти ко второму набору результатов.
* Чтение всех имен листов Excel и добавление нескольких листов в один набор данных с именами таблиц в качестве имен листов.*
Глобальные переменные
Dim excelSheetNames As String ()
Dim DtSet As System.Data.DataSet = New DataSet ()
Private Sub btnLoadData_Click (ByVal отправитель как System.Object, ByVal e как System.EventArgs) Обрабатывает btnLoadData.Click
Dim MyConnection As OleDbConnection
Dim da As System.Data.OleDb.OleDbDataAdapter
Дим я как целое
MyConnection = New System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;
источник данных =SStatus.xls; Расширенные свойства =""Excel 8.0;HDR= НЕТ;IMEX=1"" ")
Следующий метод получает все имена листов Excel в глобальном массиве excelSheetNames
GetExcelSheetNames ("SStatus.xls")
For Each str As String In excelSheetNames
da = New OleDbDataAdapter("select * from [" & str & "]", MyConnection)
da.Fill(DtSet, excelSheetNames(i))
i += 1
Next
DataGridView1.DataSource = DtSet.Tables(0)
End Sub
Открытая функция GetExcelSheetNames(ByVal excelFileName As String)
Dim con As OleDbConnection = Nothing
Dim dt As DataTable = Nothing
Dim conStr As String = ("Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=") + excelFileName & ";Extended Properties=Excel 8.0;"
con = New OleDbConnection(conStr)
con.Open()
dt = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)
excelSheetNames = New String(dt.Rows.Count - 1) {}
Dim i As Integer = 0
For Each row As DataRow In dt.Rows
excelSheetNames(i) = row("TABLE_NAME").ToString()
i += 1
Next
End Function