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();
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
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.
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
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.:-)
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.
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();
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
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
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
24/04/2009
Lorena Menelli
Como faço para salvar meu banco para mandar por e-mail. Qual e-mail devo mandar?
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.
24/04/2009
[devmedia .net]
Olá, que bom !!
Precisando estamos aí !!
Abraços
Carlos
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.
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é?