inserção em tabelas
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
Curtidas 0
Respostas
Lorena Menelli
22/04/2009
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();
GOSTEI 0
[devmedia .net]
22/04/2009
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
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
GOSTEI 0
Lorena Menelli
22/04/2009
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.
GOSTEI 0
[devmedia .net]
22/04/2009
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
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
GOSTEI 0
Lorena Menelli
22/04/2009
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.:-)
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.:-)
GOSTEI 0
Lorena Menelli
22/04/2009
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.
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.
GOSTEI 0
Lorena Menelli
22/04/2009
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();
GOSTEI 0
[devmedia .net]
22/04/2009
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
Me envie seu email para que eu posso lhe enviar um projeto com essas informações.
Abraços Carlos Jr
GOSTEI 0
Lorena Menelli
22/04/2009
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
GOSTEI 0
[devmedia .net]
22/04/2009
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
GOSTEI 0
Lorena Menelli
22/04/2009
Como faço para salvar meu banco para mandar por e-mail. Qual e-mail devo mandar?
GOSTEI 0
Lorena Menelli
22/04/2009
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.
GOSTEI 0
[devmedia .net]
22/04/2009
Olá, que bom !!
Precisando estamos aí !!
Abraços
Carlos
GOSTEI 0
Devmedia
22/04/2009
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.
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.
GOSTEI 0
Lorena Menelli
22/04/2009
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é?
GOSTEI 0
[devmedia .net]
22/04/2009
Oi Lorena,
funciona perfeitamente....
Abraços
Carlos Jr
GOSTEI 0