Fórum inserção em tabelas #4841

22/04/2009

0

Boa tarde   Estou com um problema na inserção de dados em uma tabela. eu criei um string sql da seguinte forma?   string sql = "INSERT INTO clientes (nome, endereco,telefone,idade,data_nasc,sexo) VALUES" + "('" + txtNome.Text + "','" + txtEndereco.TemplateControl + "','" + txtTel.Text + "'," + txtIdade + ",'" + txtDataNasc.Text + "'," + ddlSexo.SelectedValue + ")";   mais a seguinte exeção é lançada: erro O nome "System.Web.UI.WebControls.TextBox" não é permitido neste contexto. As expressões válidas são constantes, expressões e (em alguns contextos) variáveis. Nomes de coluna não são permitidos.  
Lorena Menelli

Lorena Menelli

Responder

Posts

22/04/2009

Lorena Menelli

eu acertei o variável sql:   string sql = "INSERT INTO clientes (nome, endereco,telefone,idade,data_nasc,sexo) VALUES" + "('" + txtNome.Text + "','" + txtEndereco.Text + "','" + txtTel.Text + "'," + txtIdade.Text + ",'" + txtDataNasc.Text + "'," + ddlSexo.SelectedValue + ")";   mais agora outro erro aparece: erro: The connection was not closed. The connection's current state is open.   não estou entendendo, estou fechando a conexão normalmente.   ... Button... ConnectionSting.Sconnect.Open(); SqlCommand command = new SqlCommand(sql, ConnectionSting.Sconnect); command.ExecuteNonQuery(); ConnectionSting.Sconnect.Close(); upDataGrid();   método upDateGrid .. ConnectionSting.Sconnect.Open(); SqlCommand command = new SqlCommand("select * from clientes", ConnectionSting.Sconnect); GridView1.DataSource = command.ExecuteReader(CommandBehavior.CloseConnection); GridView1.DataBind();
Responder

Gostei + 0

22/04/2009

[devmedia .net]

Olá Lorena tudo bem ?   Bom seu erro não é tão complicado..   Só uma pergunta, o método do Button chama o upDataGrid ????
Se for , não precisa ter os comandos de conexão duas vezes, apenas o do método upDataGrid resolve, mas deve fazer as alterações abaixo agora se forem coisas diferentes, arrume-os como está abaixo.   veja o código corrigido,   ... Button... ConnectionSting.Sconnect.Open(); SqlCommand command = new SqlCommand(sql, ConnectionSting.Sconnect); //Corrigido SqlCommand command = new SqlCommand(sql);   command.ExecuteNonQuery(); ConnectionSting.Sconnect.Close(); upDataGrid(); método upDateGrid .. ConnectionSting.Sconnect.Open(); SqlCommand command = new SqlCommand("select * from clientes", ConnectionSting.Sconnect); //Corrigido SqlCommand command = new SqlCommand("select * from clientes");   GridView1.DataSource = command.ExecuteReader(CommandBehavior.CloseConnection);
//Corrigido GridView1.DataSource = command.ExecuteReader(); GridView1.DataBind(); //Adicionado ConnectionSting.Sconnect.Close();   - Você não pode fechar a conexão antes do DataBind()   Grande abraço   Carlos Jr
Responder

Gostei + 0

22/04/2009

Lorena Menelli

Olá Carlos, tudo bem.   ConnectionSting.Sconnect isso é uma classe que retorna a propiedade Sconnect. No caso, o retorno seria a propia instância, ou não?   Quando eu retiro essa parte ocorre o seguinte erro.   ERRO ExecuteReader: Connection property has not been initialized.   class ConnectionSting ... public static SqlConnection Sconnect{ get{ if (sconnect == null) { sconnect = new SqlConnection(ConfigurationManager.ConnectionStrings["ConectionString"].ConnectionString); } return sconnect; ...  Button1_Click vai inserir dados do formulário no banco.   string sql = "INSERT INTO clientes (nome, endereco,telefone,idade,data_nasc,sexo) VALUES" + "('" + txtNome.Text + "','" + txtEndereco.Text + "','" + txtTel.Text + "'," + txtIdade.Text + ",'" + txtDataNasc.Text + "'," + ddlSexo.SelectedValue + ")"; ConnectionSting.Sconnect.Open(); SqlCommand sqlcommand = new SqlCommand(sql, ConnectionSting.Sconnect); //conexÆo que faz parte do comando para retornar o tipo sqlconnection? //pr¢pia instÆcia: ConnectionString ‚ uma classe classe sqlcommand.ExecuteNonQuery(); ConnectionSting.Sconnect.Close(); upDataGrid();   upDataGrid() - Atualiza o gridWiel ConnectionSting.Sconnect.Open(); SqlCommand sqlcommand = new SqlCommand("select * from clientes"); GridView1.DataSource = sqlcommand.ExecuteReader(); GridView1.DataBind(); com o ConnectionString.Sconnect   Erro envio de dados para o gridThe connection was not closed. The connection's current state is open.
Responder

Gostei + 0

22/04/2009

[devmedia .net]

Olá,
Você deve usar a connection string no command...   Segue a maneira correta de se fazer uma conexão com banco de dados... Ignore campos e nome de tabela fiz um exemplo qualquer...   const string SQL = "INSERT INTO [Imagens] ([nomeArquivo], [horaUpload], [MIME], [imagem]) VALUES _
                                                                                               (@nomeArquivo, @horaUpload, @MIME, @imagem)";
      //Veja que aqui eu crio o commando
       SqlCommand cmd = new SqlCommand(SQL, Conn);            //Aqui adiciono parâmetro      cmd.Parameters.AddWithValue("@imagem", imageBytes);
    cmd.Parameters.AddWithValue("@horaUpload", DateTime.Now);  //Abro a conexão antes de executar o command
Conn.Open(); cmd.ExecuteNonQuery();
    Conn.Close();
  Outra maneira de fazer isso é...   SqlConnection myConn = new SqlConnection ( connString );
   SqlCommand myCommand = new SqlCommand ( query, myConn );
   myCommand.Connection.Open ( );

   SqlDataReader myReader =
      myCommand.ExecuteReader ( CommandBehavior.CloseConnection );

   myReader.Close ( );
   myConn.Close ( );
}     Se ainda não conseguir resolver, me envie seu código completo (parte de conexão) que corrijo para você. Abraços,   Carlos Jr
Responder

Gostei + 0

23/04/2009

Lorena Menelli

Não estou conseguindo entender esse código. Esse meu código é do cursos de Curso Online
Banco de dados e .NET Pedro Bajjoto. Na verdade ele informa que a aquele não é o melhor método de modelagem, pq fica abrindo e fechando a conexão. Mas eu achei bem fácil de apreender. A questão é que tenho um teste para fazer essa semana e é justamente criar uma conexão com o banco recuperar informações e fazer insert dos dados do formulário.   O curso ensina justamente isso, mais aparentemente está tudo conforme ele ensina, se não fosse o erro:          The connection was not closed. The connection's current state is open.   Eu não queria sair desse código, pq já estudei ele e já fiz ele varias vezes. Só tinha que funcionar.:-)  
Responder

Gostei + 0

23/04/2009

Lorena Menelli

Outra coisa... Mais para frente do curso o Autor cria uma store Procedure e não recomenda o uso desse tipo:
string sql = "INSERT INTO clientes (nome, endereco,telefone,idade,data_nasc,sexo) VALUES" + "('" + txtNome.Text + "','" + txtEndereco.Text + "','" + txtTel.Text + "'," + txtIdade.Text + ",'" + txtDataNasc.Text + "'," + ddlSexo.SelectedValue + ")";   Porem, pelas informaçõs que recebi sobre o teste que eu vou fazer, eu não vou precisar criar procedimentos no banco, com isso, posso optar por uma maneira mais simples de fazer insert no banco.
Responder

Gostei + 0

23/04/2009

Lorena Menelli

Acho que acertei o código.. mais agora está dando esse erro:   gridErro ao converter tipo de dados nvarchar em datetime.   No banco a tablea data_nasc está com datatime.   e como vc mesmo recomendou estou usando parametros   ConnectionSting.Sconnect.Open(); SqlCommand sqlcommand = new SqlCommand("InsertCliente", ConnectionSting.Sconnect); sqlcommand.CommandType = CommandType.StoredProcedure; sqlcommand.Parameters.Add(new SqlParameter("@nome", txtNome.Text)); sqlcommand.Parameters.Add(new SqlParameter("@endereco", txtEndereco.Text)); sqlcommand.Parameters.Add(new SqlParameter("@telefone", txtTel.Text)); sqlcommand.Parameters.Add(new SqlParameter("@idade", txtIdade.Text)); sqlcommand.Parameters.Add(new SqlParameter("@data_nasc", txtDataNasc.Text)); sqlcommand.Parameters.Add(new SqlParameter("@sexo", ddlSexo.SelectedValue)); sqlcommand.ExecuteNonQuery(); ConnectionSting.Sconnect.Close(); upDataGrid();  
Responder

Gostei + 0

23/04/2009

[devmedia .net]

Olá Lorena, estou aqui para lhe ajudar sempre...   Essa sua linha está errada veja SqlCommand sqlcommand = new SqlCommand("InsertCliente", ConnectionSting.Sconnect);   no lugar de InsertCliente deve ter uma variável string com o comando de insert ou a comando por completo..   SqlCommand sqlcommand = new SqlCommand("insert into cliente values(@nome, @data)", ConnectionSting.Sconnect);   Entendeu...   Fiz um código para você veja...   protected void btnEnviar_Click(object sender, EventArgs e) { SqlConnection connection = new SqlConnection(); try { connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["minhaconexao"].ToString()); SqlCommand command = new SqlCommand("INSERT INTO USUARIO VALUES(@NOME, @EMAIL, @IDADE)", connection); command.Parameters.Add(new SqlParameter("@NOME", txtNome.Text)); command.Parameters.Add(new SqlParameter("@EMAIL", txtEmail.Text)); command.Parameters.Add(new SqlParameter("@IDADE", txtIdade.Text)); connection.Open(); command.ExecuteNonQuery(); lblMsg.Text = "Usu rio inclu¡do com sucesso !!!!"; retornarUsuarios(); } catch (Exception erro) { lblMsg.Text = "Erro ao incluir registro ! [" + erro.Message + "]"; } finally { connection.Close(); } } public void retornarUsuarios() { SqlConnection connection = new SqlConnection(); try { connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["minhaconexao"].ToString()); SqlDataAdapter dataAdapter = new SqlDataAdapter("SELECT * FROM USUARIO",connection); DataSet dataSet = new DataSet(); dataAdapter.Fill(dataSet, "Usuario"); lblMsg.Text = "Usu rios retornados com sucesso !!"; GridView1.DataSource = dataSet.Tables["Usuario"]; //ESTOU USANDO DATASET E NÃO DATAREADER GridView1.DataBind(); } catch (Exception erro) { lblMsg.Text = "Erro ao buscar usu rios !!"; } }   DataReader trabalha conectado com o banco de dados, você deve abrir e fechar a conexão.. O DataSet trabalha desconectado e o DataAdapter que abre e fecha conexão, essa é a diferença entre os dois.

Me envie seu email para que eu posso lhe enviar um projeto com essas informações.
Abraços   Carlos Jr
Responder

Gostei + 0

24/04/2009

Lorena Menelli

Carlos, fiz o código que vc me passou mais agora outro erro ocorre. Criei um novo website, e não tem aquela classe no AppCode.   Erro ao incluir usuário Erro de inserção: o nome da coluna ou o número de valores fornecidos não corresponde à definição da tabela.   web.config   <add name="ConnectionNameDb" connectionString="Data Source=localhost; Initial Catalog=testDb; User=sa; Password=msalo" providerName="System.Data.SqlClient"/> <compilation debug="true"> Default.aspx.cs   protected void Button1_Click(object sender, EventArgs e) { SqlConnection connection = new SqlConnection(); try { connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionNameDb"].ToString()); SqlCommand command = new SqlCommand("INSERT INTO clientes VALUES(@nome,@endereco,@telefone,@idade,@data_nasc,@sexo)", connection); command.Parameters.Add(new SqlParameter("@nome", txtNome.Text)); command.Parameters.Add(new SqlParameter("@endereco", txtEndereco.Text)); command.Parameters.Add(new SqlParameter("@telefone", txtTel.Text)); command.Parameters.Add(new SqlParameter("@idade", txtIdade.Text)); command.Parameters.Add(new SqlParameter("@data_nasc", txtDataNasc.Text)); command.Parameters.Add(new SqlParameter("@sexo", ddlSexo.SelectedValue)); connection.Open(); command.ExecuteNonQuery(); llbestado.Text = "Usu rio incluido com sucesso"; retornaUsuario(); } catch (Exception erro) { llbresul2.Text = "Erro ao incluir usu rio" + erro.Message; } finally { connection.Close(); } } public void retornaUsuario() { SqlConnection connection = new SqlConnection(); try { connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionNameDb"].ToString()); SqlDataAdapter dataAdapter = new SqlDataAdapter("select * from clientes", connection); DataSet dataSet = new DataSet(); dataAdapter.Fill(dataSet,"clientes"); llbestado.Text = "Usu rio tetornado com sucesso!"; GridView1.DataSource = dataSet.Tables["clientes"]; GridView1.DataBind(); } catch (Exception ex) { llbresul2.Text = " Erro ao buscar usu rio"; } } Desntro do Bd há o seguinte StoreProcedures <dbo.InsertClinet> Acho que no meu test não vou precisar usar, eles me falaram que não precisa criar procedimentos no banco pois vou trabalhar com o banco pronto.   set ANSI_NULLS ON set QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[InsertCliente] @nome varchar(250), @endereco varchar(250), @telefone varchar(50), @idade int, @data_nasc datetime, @sexo bit AS BEGIN SET NOCOUNT ON; INSERT INTO clientes (nome,endereco,telefone,idade,data_nasc,sexo) VALUES (@nome,@endereco,@telefone,@idade,@data_nasc,@sexo) END
Responder

Gostei + 0

24/04/2009

[devmedia .net]

Oi Lorena, tudo bem ?   Sua tabela contém esses campos mesmos que estão no insert ?   SqlCommand command = new SqlCommand("INSERT INTO clientes VALUES(@nome,@endereco,@telefone,@idade,@data_nasc,@sexo)", connection);   você tem um campo de código de cliente ?? Ele é Identity ? Para que você não precise declará-lo no insert ele deve Identity...   me envie o script da sua tabela que eu monto um insert funcional para você, ou me envie sua aplicação...   Abraços   Carlos Jr
Responder

Gostei + 0

24/04/2009

Lorena Menelli

Como faço para salvar meu banco para mandar por e-mail. Qual e-mail devo mandar?
Responder

Gostei + 0

24/04/2009

Lorena Menelli

Carlos, obrigado pela grande ajuda.   Deu certo.... era isso mesmo que vc falou ELECT @@ID = @@IDENTITY   Tá funcinando muito bem. xau e abraço. pode fechar.
Responder

Gostei + 0

24/04/2009

[devmedia .net]

Olá, que bom !!   Precisando estamos aí !!   Abraços   Carlos
Responder

Gostei + 0

24/04/2009

Devmedia

Lorena,
todas as informações referentes ao chamado devem ser postadas dentro do serviço de consultoria.
Uma solução para o seu problema seria vc utilizar o disco virtual.
Vc deve colocar lá arquivos no formato .zip ou .rar.
Caso tenha dúvidas, vc pode ver o video que está ao lado da opção "meu disco virtual".
Att.
Responder

Gostei + 0

24/04/2009

Lorena Menelli

Ok entendi,   Gostaria de tirar mais um duvida sobre o assunto.   Carlos, no teste que devo fazer eu não vou precisar criar strored Prcedure. Para fazer uma conexão com apenas uma tabela basta eu fazer da forma que vc me passou:   connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionNameDb"].ToString()); SqlCommand command = new SqlCommand("INSERT INTO clientes VALUES(@nome,@endereco,@telefone,@idade,@data_nasc,@sexo)", connection); command.Parameters.Add(new SqlParameter("@nome", txtNome.Text)); command.Parameters.Add(new SqlParameter("@endereco", txtEndereco.Text)); command.Parameters.Add(new SqlParameter("@telefone", txtTel.Text)); command.Parameters.Add(new SqlParameter("@idade", txtIdade.Text)); command.Parameters.Add(new SqlParameter("@data_nasc", txtDataNasc.Text)); command.Parameters.Add(new SqlParameter("@sexo", ddlSexo.SelectedValue)); connection.Open(); command.ExecuteNonQuery(); llbestado.Text = "Usu rio incluido com sucesso"; retornaUsuario(); esse codigo faz a inserção de dados em apenas uma tabela. quer dizer, se o meu banco tiver apenas a tabela clentes com as colunas nome,endereco,telefone, idade,data_nasc, sexo, funcina tranquilo né?  
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar