none
Vários comandos em um SQLCommand RRS feed

  • 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}, ", drIdea);
    }
    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?
    segunda-feira, 7 de abril de 2008 17:59

Todas as Respostas

  •  

    Cassios,

     

    Depois de utilizar o objeto comm "ExecuteReader()", liberar o objeto através do método comm.Dispose();

     

    Code Snippet

           SqlCommand 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.

    segunda-feira, 7 de abril de 2008 18:09
  • 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 Snippet

    using 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 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?

    segunda-feira, 7 de abril de 2008 18:43
  • Cassius,

    Veja se assim funciona:

    Code Snippet

     

    using 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 Snippet

    string 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.

     

    segunda-feira, 7 de abril de 2008 18:54
  • Obrigado Laercio!

    segunda-feira, 7 de abril de 2008 19:13
  • 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}, ", drIdea);

    }

    Console.WriteLine();

    }

     

    dr.Close();

    conn.Close();

     

    Console.ReadLine();

     

    segunda-feira, 7 de abril de 2008 19:14
  • Fico feliz por ter ajudado!

     

    Depois não deixe de marcar o meu post como útil caso tenha ajudado!

     

     

    Ajude a melhorar o nosso Fórum!
    Não esqueça de marca a mensagem como "útil", caso tenha ajudado.

    segunda-feira, 7 de abril de 2008 19:20
  • 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 Snippet

    using 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!
    segunda-feira, 7 de abril de 2008 19:24