Inquiridor
Vários comandos em um SQLCommand

Pergunta
-
Olá pessoal,
usando ADO.NET, System.Data.SqlClient, em um mesmo método (main), desejo criar uma tabela, inserir alguns registros e exibir esses registros.
Estou com dificuldades em rodar mais de um comando SQL no código. Estou fazendo o seguinte:string starConexao = " Data Source=Cassius;Initial Catalog=escola;Integrated Security=SSPI";
SqlConnection conn = new SqlConnection(starConexao);
conn.Open();
string criar = "create table tb_clientes(id_cliente int not null, nm_cliente varchar(45) not null, email_cliente varchar(25) not null, constraint pk_clientes primary key(id_cliente))";
string incluir = "insert into tb_clientes(id_cliente, nm_cliente, email_cliente) values(1, 'Cassius MG','cassius@cassius.com')";
string exibir = ("select * from tb_clientes");
SqlCommand comm = new SqlCommand(criar, conn);
comm.ExecuteReader();
comm = new SqlCommand(incluir, conn);
comm.ExecuteReader();
comm = new SqlCommand(exibir, conn);
comm.ExecuteReader();
SqlDataReader dr = comm.ExecuteReader();
for (int i = 0; i < dr.FieldCount; ++i)
{
Console.Write("{0},", dr.GetName(i));
}
Console.WriteLine();
while (dr.Read())
{
for (int i = 0; i < dr.FieldCount; ++i)
{
Console.WriteLine("{0}, ", dr);
}
Console.WriteLine();
}
dr.Close();
conn.Close();
Ao tentar rodar esse código recebo o erro "There is already an open DataReader associated with this Command which must be closed first", referente ao comando de inclusão (comm = new SqlCommand(incluir, conn)).
Alguém sabe como resolver?
Todas as Respostas
-
Cassios,
Depois de utilizar o objeto comm "ExecuteReader()", liberar o objeto através do método comm.Dispose();
Code SnippetSqlCommand comm = new SqlCommand(criar, conn);
comm.ExecuteReader();comm.Dispose();
comm = new SqlCommand(incluir, conn);
comm.ExecuteReader();comm.Dispose();
comm = new SqlCommand(exibir, conn);
comm.ExecuteReader();comm.Dispose();
Uma dica, nos 2 primeiros command, troque o comm.ExecuteReader(), por comm.ExecuteNonQuery() .Este método é usado para executar um comando SQL que não retorna registros.
Ajude a melhorar o nosso Fórum!
Não esqueça de marca a mensagem como "útil", caso tenha ajudado. -
Laercio, inclui o .Disponse() como vc me falou. Entretanto, ainda dá erro "There is already an open DataReader associated with this Command which must be closed first".
Meu código está assim:
Code Snippetusing
System;using
System.Data;using
System.Data.SqlClient;namespace
MsdnAA{
{
{
conn.Open();
string criar = "create table tb_clientes(id_cliente int not null, nm_cliente varchar(45) not null, email_cliente varchar(25) not null, constraint pk_clientes primary key(id_cliente))";
string incluir = "insert into tb_clientes(id_cliente, nm_cliente, email_cliente) values(1, 'Cassius MG','cassius@cassius.com')";
string exibir = ("select * from tb_clientes");
SqlCommand comm = new SqlCommand(criar, conn);
comm.ExecuteReader();
comm.Dispose();
comm = new SqlCommand(incluir, conn);
comm.ExecuteNonQuery();
comm.Dispose();
comm = new SqlCommand(exibir, conn);
SqlDataReader dr = comm.ExecuteReader();
comm.Dispose();
Console.WriteLine();
while (dr.Read())
{
for (int i = 0; i < dr.FieldCount; ++i)
{
Console.WriteLine("{0}, ", dr[i]);
}
Console.WriteLine();
}
dr.Close();
conn.Close();
Console.ReadLine();
}
}
}
Consegue me dizer o que está errado?
-
Cassius,
Veja se assim funciona:
Code Snippetusing System;
using
System.Data;using
System.Data.SqlClient;namespace
MsdnAA{
class AdoNetApp{
static void Main(string[] args){
string starConexao = " Data Source=MYCOMPUTER;Initial Catalog=escola;Integrated Security=SSPI"; SqlConnection conn = new SqlConnection(starConexao);conn.Open();
string criar = "create table tb_clientes(id_cliente int not null, nm_cliente varchar(45) not null, email_cliente varchar(25) not null, constraint pk_clientes primary key(id_cliente))"; string incluir = "insert into tb_clientes(id_cliente, nm_cliente, email_cliente) values(1, 'Cassius MG','cassius@cassius.com')"; string exibir = ("select * from tb_clientes");SqlCommand commCriar = new SqlCommand(criar, conn);
commCriar.ExecuteNonQuery();
commCriar.Dispose();
commIncluir = new SqlCommand(incluir, conn);
commIncluir.ExecuteNonQuery();
commIncluir.Dispose();
comm = new SqlCommand(exibir, conn);
SqlDataReader dr = comm.ExecuteReader();
for (int i = 0; i < dr.FieldCount; ++i)
{
Console.Write("{0},", dr.GetName(i));
}
Console.WriteLine();
while (dr.Read())
{
for (int i = 0; i < dr.FieldCount; ++i)
{
Console.WriteLine("{0}, ", dr);
}
Console.WriteLine();
}
comm.Dispose();
dr.Dispose();
conn.Dispose();
Console.ReadLine();
}
}
}
Uma outra dica: tente executar com apenas 1 command o create e o insert table (veja que existe um ; no final do primeiro sql. Isso melhora a performance da aplicação.
Code Snippetstring
criar_incluir = "";criar_incluir = criar_incluir +
"create table tb_clientes(id_cliente int not null, nm_cliente varchar(45) not null, email_cliente varchar(25) not null, constraint pk_clientes primary key(id_cliente));";criar_incluir = criar_incluir +
"insert into tb_clientes(id_cliente, nm_cliente, email_cliente) values(1, 'Cassius MG','cassius@cassius.com')";Ajude a melhorar o nosso Fórum!
Não esqueça de marca a mensagem como "útil", caso tenha ajudado. -
-
Cassio
O erro estar acontecendo porque voce fechou o sua conexao
comm = new SqlCommand(exibir, conn);
SqlDataReader dr = comm.ExecuteReader();
while (dr.Read())
{
for (int i = 0; i < dr.FieldCount; ++i)
{
Console.WriteLine("{0}, ", dr
);
}
Console.WriteLine();
}
dr.Close();
conn.Close();
Console.ReadLine();
-
-
Klayton, o erro que aparece é "There is already an open DataReader associated with this Command which must be closed first" apontando para o segundo "comm = new SqlCommand". Mesmo quando eu não fecho a conexão.
Parece que é bug do Visual Studio, pois, preciono F5 novamente e ele segue sem problemas. Além disso o código parece estar certinho, confira:
Code Snippetusing System;
using System.Data;
using System.Data.SqlClient;
namespace MsdnAA
{
class AdoNetApp
{
static void Main(string[] args)
{
string starConexao = " Data Source=MYCOMPUTER;Initial Catalog=escola;Integrated Security=SSPI";
SqlConnection conn = new SqlConnection(starConexao);
conn.Open();
string criar_incluir =
"create table tb_clientes(id_cliente int not null, nm_cliente varchar(45) not null, email_cliente varchar(25) not null, constraint pk_clientes primary key(id_cliente))"
+ "insert into tb_clientes(id_cliente, nm_cliente, email_cliente) values(1, 'Cassius MG','cassius@cassius.com')"
+ "insert into tb_clientes(id_cliente, nm_cliente, email_cliente) values(2, 'Fulano MR','fulano@fulano.com')"
+ "insert into tb_clientes(id_cliente, nm_cliente, email_cliente) values(3, 'Beltrano VR','beltrano@beltrano.com')";
string exibir = ("select * from tb_clientes");
SqlCommand comm = new SqlCommand(criar_incluir, conn);
comm.ExecuteReader();
comm.Dispose();
comm = new SqlCommand(exibir, conn);
SqlDataReader dr = comm.ExecuteReader();
Console.WriteLine();
while (dr.Read())
{
for (int i = 0; i < dr.FieldCount; ++i)
{
Console.WriteLine("{0}, ", dr[i]);
}
Console.WriteLine();
}
comm.Dispose();
dr.Dispose();
conn.Dispose();
Console.ReadLine();
}
}
}
Obrigado por tentar me ajudar!