Tag Archives: ADO.NET

C# – Retornando mais de uma tabela com DataReader

Não é muito comum, mas o ADO.NET nos dá a possibilidade de através de uma consulta feita pelo objeto Command (ou DataAdapter), retornar mais de um ResultSet ou tabela do banco de dados.

Em um exemplo, veja o código abaixo

1
2
3
4
5
6
7
8
9
10
11
string select = "select * from Categories; select * from Customers";
SqlCommand command = new SqlCommand ( select, conn );
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = command;
DataSet ds = new DataSet();
adapter.Fill(ds);
 
foreach(DataTable table in ds.Tables)
{
  Console.WriteLine(table.TableName);
}

Naturalmente, o comando sql podia chamar uma stored procedure existente no banco de dados, o que daria o mesmo efeito. Com isso, o DataSet ds teria como resultado 2 objetos DataTable preenchidos, Categories e Customers, resultado do comando sql disparado.

Mas, como conseguir esse efeito com um DataReader, sendo que comumente sempre esperamos um ResultSet, iterando através dos campos diretamente pelo índice ou nome deste? Simples! A interface IDataReader possui o método NextResult que permite pular para o próximo ResultSet, caso este exista. O NextResult retorna um bool, que da mesma forma que o método Read, retorna true se houver mais resultados e automaticamente “move o cursor” para o próximo ResultSet. O exemplo abaixo demonstra o funcionamento:

1
2
3
4
5
6
7
8
9
10
11
12
string select = "select * from Categories; select * from customers";
SqlCommand command = new SqlCommand ( select, conn );
conn.Open ();
SqlDataReader reader = command.ExecuteReader ();
 
do
{
  while ( reader.Read () )
  {
    Console.WriteLine ( "{0}\t\t{1}", reader[0], reader[1] );
  }
}while ( reader.NextResult () );

Referências:

http://stackoverflow.com/