Na linguagem de programação C# você pode usar o objeto SqlDataReader através de um driver ADO.NET para retornar campos de um set de dados no qual poderá ser manipulado de modo que você possa escolher qualquer um dos campos da tabela contida em seu Dataset.
Vale ressaltar que no programa abaixo não utilizamos um método genérico para manipular os dados e sim um driver especifico de cada fornecedor de banco de dados, optamos por este método pois somente ele possibilita utilizar features avançadas de cada um de seus respectivos fornecedores(Oracle e IBM)
Ai esta uma grande diferença entre Java e C#, você pode analisar o código em Java (mesmo programa) que nos permite utilizar os drivers JDBC nativos de cada fornecedor utilizando um ResultSet comum. O C# não possui o objeto ResultSet mas é possível cria-lo à partir de interfaces abstratas chamadas IDataReader, IDataRecord, IEnumerable e IDisposable.
Um ResultSet é muito similar ao DataReader, porem permite que você navegue por qualquer parte do set de resultado sem precisar criar outra conexão, visto que os drivers Oracle e IBM, já utilizam esta arquitetura, veja comentários no código abaixo e teste como funciona na pratica. A Microsoft disponibiliza um exemplo simples de como implementar um ResultSet, mas para uso em escala empresarial, você precisa aprimorar o exemplo básico disponível no MSDN.
ResultSet – C#: http://msdn.microsoft.com/en-us/library/ff878121.aspx
Para utilizar uma linha de dados por coluna em C# nos bancos de dados Oracle, DB2 e MSSQL, siga os seguintes passos:
1 – Crie a tabela de exemplo e insira as linhas de dados com o script para o seu banco de dados que você encontra logo abaixo. No Visual Studio crie um design como na figura abaixo, utilizando 7 Labels, 6 TextBox, 2 Panel e um Button.
Exemplo:
Este programa foi escrito para retornar uma linha de dados em uma tabela e exibir os campos em caixas de textos.
SQL
Oracle
create table Funcionarios ( ID_Funcionario NUMBER(5), Nome VARCHAR2(30), Sobrenome VARCHAR2(70), Cargo VARCHAR2(30), Salario NUMBER(9,2) ); Insert into FUNCIONARIOS values (1,'Steve','Gates','Programador',2550.56); Insert into FUNCIONARIOS values (2,'Bill','Jobs','Diretor',5143.71);
DB2
create table Funcionarios ( ID_Funcionario INTEGER, Nome VARCHAR(30), Sobrenome VARCHAR(70), Cargo VARCHAR(30), Salario NUMERIC(9,2) ); Insert into FUNCIONARIOS values (1,'Steve','Gates','Programador',2550.56); Insert into FUNCIONARIOS values (2,'Bill','Jobs','Diretor',5143.71);
Mssql
create table Funcionarios ( ID_Funcionario Int, Nome VARCHAR(30), Sobrenome VARCHAR(70), Cargo VARCHAR(30), Salario Decimal(9,2) ); Insert into FUNCIONARIOS values (1,'Steve','Gates','Programador',2550.56); Insert into FUNCIONARIOS values (2,'Bill','Jobs','Diretor',5143.71);
C#
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Data.SqlClient; using Oracle.DataAccess.Client; using IBM.Data.DB2; namespace DACampos { public partial class Campos : Form { // Declara componentes de conexão private static OracleConnection connORA; // ODAC 12c private static DB2Connection connDB2; // IBM Data Server Provider private static SqlConnection connMSSQL; // ADO .NET // ************** Sobre Conexões - ADO.NET ************** // // A Microsoft disponibiliza por exemplo, o System.Data.OracleClient // porem se tornou obsoleto e ainda é suportado somente // a nível de compatibilidade com versões anteriores do Framework. // A Microsoft recomenda utilizar o driver de cada fornecedor: // // veja: http://msdn.microsoft.com/en-us/library/77d8yct7.aspx // // Você pode utilizar a classe DbProviderFactory // para criar um único datasource para todos os bancos de dados: // // http://msdn.microsoft.com/pt-br/library/system.data.common.dbproviderfactory(v=vs.110).aspx // // No entanto diferentemente da linguagem JAVA (JDBC) o ADO.NET não suporta // alguns recursos do Oracle e IBM DB2. // // *** Factory *** // // Utilizando conexões únicas de cada provedor de banco de dados // através de um Factory, permite que você utilize um único set de instruções // para todos os bancos de dados. // // Atente-se que se utilizar instruções únicas, em alguns casos poderá encontrar // alguns erros de compatibilidade ou criar certas limitações a outros bancos. // O ADO.NET é desenvolvido para o MSSQL Server e está sujeito // a algumas limitações quando utilizar alguns tipos de campos, // conceitos de conexão e acesso a dados de outros bancos de dados. // // Sistemas de grande porte possuem um Dicionário de dados // para se prevenir destas situações. // // Veja este mesmo programa utilizando o DriverManager equivalente ao factory para java // e veja comentários extras no código apontando diferenças de conceitos. // Declara variável do banco de dados private static string DBconexao; public Campos() { InitializeComponent(); } // Cria método de conexão public void conectarDB(string banco) { DBconexao = banco; if (banco == "oracle") { try { // String de Conexao string connectionString = // Usuario "User Id=user"+ // Senha ";Password=p@55w0rd" + // TNSnames ";Data Source=XE"; //Conecta ao datasource usando a conexão Oracle connORA = new OracleConnection(connectionString); //Abre a conexão com o banco de dados connORA.Open(); } // Retorna erro catch (Exception ex) { // Mostra menssagem de erro MessageBox.Show(ex.ToString()); } } if (banco == "db2") { try { // String de Conexao string connectionString = // Servidor "Server=localhost" + // Banco de dados ";Database=DEVA" + // Usuario ";UID=db2admin" + // Senha ";PWD=p@55w0rd" + // Timeout ";Connect Timeout=40"; //Conecta ao datasource usando a conexão DB2 connDB2 = new DB2Connection(connectionString); //Abre a conexão com o banco de dados connDB2.Open(); } // Retorna erro catch (Exception ex) { // Mostra menssagem de erro MessageBox.Show(ex.ToString()); } } if (banco == "mssql") { try { // String de Conexao string connectionString = // Servidor "Data Source=localhost" + // Banco de dados ";Initial Catalog=DevAberto" + // Usuario ";User ID =user" + // Senha ";Password=p@55w0rd" + // Timeout ";Connect Timeout=40"; //Conecta ao datasource usando a conexão Padrão connMSSQL = new SqlConnection(connectionString); //Abre a conexão com o banco de dados connMSSQL.Open(); } // Retorna erro catch (Exception ex) { // Mostra menssagem de erro MessageBox.Show(ex.ToString()); } } } // Evento de clique do botão private void button1_Click(object sender, EventArgs e) { // Cria instancia do objeto Campos campos = new Campos(); // A variável abaixo: // Define banco de dados // oracle = Oracle Database // db2 = IBM DB2 Database // mssql = Microsoft SQL Server campos.conectarDB("oracle"); // Define instrução SQL string sql = "Select * From FUNCIONARIOS Where ID_FUNCIONARIO = " + textBox6.Text; // Usando um procedimento de conexão para da driver especifico // Oracle - ODAC if (DBconexao == "oracle") { label1.Text = "Database - fields : " + DBconexao; OracleCommand oracmd = new OracleCommand(sql, connORA); OracleDataReader orareader = oracmd.ExecuteReader(); if (orareader.HasRows) { while (orareader.Read()) { textBox1.Text = Convert.ToString(orareader.GetInt32(0)); textBox2.Text = orareader.GetString(1); textBox3.Text = orareader.GetString(2); textBox4.Text = orareader.GetString(3); textBox5.Text = Convert.ToString(orareader.GetDecimal(4)); } } } // IBM Data Server Provider if (DBconexao == "db2") { label1.Text = "Database - fields : " + DBconexao; DB2Command db2cmd = new DB2Command(sql); db2cmd.Connection = connDB2; DB2DataReader db2reader = db2cmd.ExecuteReader(); if (db2reader.HasRows) { while(db2reader.Read()) { textBox1.Text = Convert.ToString(db2reader.GetInt32(0)); textBox2.Text = db2reader.GetString(1); textBox3.Text = db2reader.GetString(2); textBox4.Text = db2reader.GetString(3); textBox5.Text = Convert.ToString(db2reader.GetDecimal(4)); } } } // microsoft ADO.NET if (DBconexao == "mssql") { label1.Text = "Database - fields : " + DBconexao; SqlCommand mssqlcmd = new SqlCommand(sql); mssqlcmd.Connection = connMSSQL; SqlDataReader mssqlreader = mssqlcmd.ExecuteReader(); if (mssqlreader.HasRows) { while (mssqlreader.Read()) { textBox1.Text = Convert.ToString(mssqlreader.GetInt32(0)); textBox2.Text = mssqlreader.GetString(1); textBox3.Text = mssqlreader.GetString(2); textBox4.Text = mssqlreader.GetString(3); textBox5.Text = Convert.ToString(mssqlreader.GetDecimal(4)); } // Aqui nota-se uma diferença entre os drivers // Tente utilizar a conexão sem fechar o DataReader utilizando ADO.NET nativo (MSSQL)</pre> // Tente fazer o mesmo com ODAC 12c e com o IBM DB2 Data Server Provider // ADO.NET É necessário fechar o DataReader antes de executar um sqlcommand. // ODAC não é necessário // IBM DATA Server não é necessário // // Aplica-se a qualquer DataReader ADO.NET // // Enquanto o DataReader está em uso, // o Connection associado está ocupado servindo o DataReader. // Enquanto estiver neste estado, // nenhuma outra operação pode ser realizada sobre o Connection além de fechá-lo. // Os drivers da Oracle e IBM não possuem esta arquitetura e não ocupam a conexão // permitindo ainda múltiplas operações sobre ela. } } } } }