Usuário com melhor resposta
Cadastrar dados no banco SQL

Pergunta
-
Fala galera, tudo bem
Pessoal estou iniciando meus em programação com C#, já consegui fazer algumas funcionalidades de um programinha que estou tentando desenvolver, porém estou tendo dificuldades para inserir dados no banco Sql, o código que estou usando para inserir é este:
SqlConnection conn=newSqlConnection("caminho de acesso");
SqlCommand cmd;if (txt_usuario.Text != "" & txt_senha.Text != "")
{
conn.Open();
cmd= new SqlCommand("INSERT INTO tbl_usuario VALUES('" + txt_usuario.Text + "','" + txt_senha.Text + "')",conn);
cmd.Parameters.AddWithValue(txt_usuario.Text, txt_senha.Text);
cmd.ExecuteNonQuery();
conn.Close();
txt_usuario.Enabled = false;
txt_senha.Enabled = false;Ao execute o programa e tentar cadastrar um usuário ele aparenta ter feito o cadastro, sem apresentar nenhuma mensagem de erro, e aparecendo os dados gravados na Textbox, porém quando acesso o banco de dados a informação não foi gravada. Alguém pode me ajudar.
Desde já agradeço a ajuda.
Respostas
-
Luis, tente o seguinte:
public partial class Cadastro_Usuario : Form { private SqlConnection conn; SqlCommand cmd; public Cadastro_Usuario() { InitializeComponent(); } private void Cadastro_Usuario_Load(object sender, EventArgs e) { conn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\Simor\Downloads\André\Sistema de Gestão Fialho Corretora\Sistema de Gestão Fialho Corretora\db_usuario.mdf;Integrated Security=True;Connect Timeout=30"); } private void btn_cadastrar_Click(object sender, EventArgs e) { if (!String.IsNullOrEmpty(txt_usuario.Text) && !String.IsNullOrEmpty(txt_senha.Text)) { conn.Open(); cmd = new SqlCommand("Insert Into tbl_usuario (usuario, senha) Values(@usuario, @senha)",conn); cmd.Connection = conn; cmd.Parameters.AddWithValue("@usuario", txt_usuario.Text); cmd.Parameters.AddWithValue("@senha", txt_senha.Text); int affectedRows = cmd.ExecuteNonQuery(); conn.Close(); txt_usuario.Enabled = false; txt_senha.Enabled = false; } } private void btn_novo_Click(object sender, EventArgs e) { txt_usuario.Enabled = true; txt_senha.Enabled = true; } private void btn_editar_Click(object sender, EventArgs e) { txt_senha.Enabled = true; } }
Lembrando que alterei o caminho do .mdf para minha máquina, então atente-se a isso.
Algumas observações:
- Separe teu projeto em camadas.
- Não grave a senha em texto simples. Criptografe antes de gravar.
Att., Rafael Simor
- Marcado como Resposta Marcos SJ segunda-feira, 25 de janeiro de 2016 20:24
-
Boa noite.
Tente o seguinte:
cmd= new SqlCommand("INSERT INTO tbl_usuario VALUES(@usuario, @senha)",conn); cmd.Parameters.AddWithValue("@usuario", txt_usuario.Text); cmd.Parameters.AddWithValue("@senha", txt_senha.Text);
Além disso, tu podes fazer o seguinte:
int affectedRows = cmd.ExecuteNonQuery();
Assim tu podes saber quantas linhas foram afetadas pelo comando (caso nenhuma linha tenha sido afetada, o comando não foi executado corretamente).
Att., Rafael Simor
- Sugerido como Resposta Wsti segunda-feira, 25 de janeiro de 2016 12:15
- Marcado como Resposta Levi DomingosModerator terça-feira, 26 de janeiro de 2016 17:43
-
Luis, acredito que os parâmetros sejam CaseSensitive.
Tente deixar as linhas:
cmd.Parameters.AddWithValue("@usuario", txt_usuario.Text); cmd.Parameters.AddWithValue("@senha", txt_senha.Text);
Com os parâmetros em minúsculo.
Att., Rafael Simor
- Marcado como Resposta Levi DomingosModerator terça-feira, 26 de janeiro de 2016 17:43
-
Luis, mantenha as alterações sugeridas pela gente, porém altere isso:
if (!String.IsNullOrEmpty(txt_usuario.Text) && !String.IsNullOrEmpty(txt_senha.Text))
Att., Rafael Simor
- Marcado como Resposta Levi DomingosModerator terça-feira, 26 de janeiro de 2016 17:43
Todas as Respostas
-
Boa noite.
Tente o seguinte:
cmd= new SqlCommand("INSERT INTO tbl_usuario VALUES(@usuario, @senha)",conn); cmd.Parameters.AddWithValue("@usuario", txt_usuario.Text); cmd.Parameters.AddWithValue("@senha", txt_senha.Text);
Além disso, tu podes fazer o seguinte:
int affectedRows = cmd.ExecuteNonQuery();
Assim tu podes saber quantas linhas foram afetadas pelo comando (caso nenhuma linha tenha sido afetada, o comando não foi executado corretamente).
Att., Rafael Simor
- Sugerido como Resposta Wsti segunda-feira, 25 de janeiro de 2016 12:15
- Marcado como Resposta Levi DomingosModerator terça-feira, 26 de janeiro de 2016 17:43
-
Boa noite Luis,
O que está acontecendo é que você está passando o valor do parâmetro duas vezes e eu acredito que isso pode gerar algum conflito.
Para passar o valor que será inserido diretamente no comando INSERT, você pode fazer dessa maneira:
conn.Open(); cmd= new SqlCommand("INSERT INTO tbl_usuario VALUES('" + txt_usuario.Text + "','" + txt_senha.Text + "')",conn); /* NESSE CASO, VOCÊ JÁ INSERIU OS VALORES DIRETAMENTE NO INSERT, SEM A NECESSIDADE DE ENVIAR PARÂMETROS, ENTÃO ESSA LINHA NÃO PODE SER COLOCADA. cmd.Parameters.AddWithValue(txt_usuario.Text, txt_senha.Text); */ cmd.ExecuteNonQuery(); conn.Close();
Mas se você quiser passar os valores via parâmetro, você pode fazer da seguinte maneira:
conn.Open(); cmd= new SqlCommand("INSERT INTO tbl_usuario VALUES(@CodigoUsuario, @SenhaUsuario)",conn); // Nesse comando, você escolhe o valor que o parâmetro irá receber. cmd.Parameters.AddWithValue("@CodigoUsuario", txt_usuario.Text); cmd.Parameters.AddWithValue("@SenhaUsuario", txt_senha.Text); cmd.ExecuteNonQuery(); conn.Close();
Abs.
Bruno Destro
Dicas de programação em .net, C# e SQL - http://smcode.com.br/
-
Bom dia Bruno e Rafael
Antes de tudo, muito obrigado pela ajuda, tentei executar os testes da maneira que vocês passaram mas continua não realizando a inserção dos dados na tabela, alguma outra dica do que pode estar causando este erro.
Att.
André
-
Bom dia Luis,
O servidor de banco da conexão e o banco que você está visualizando são os mesmos? Pergunto isso porque as vezes temos ambiente de desenvolvimento, homologação e produção com as mesmas estruturas, mudando apenas o endereço do servidor.
Abs.
Bruno Destro
Dicas de programação em .net, C# e SQL - http://smcode.com.br/
-
Bruno, tentei mudar a conexão com o banco de dados, pegando a conexão que faz a validação de usuario para logar no sistema, porém continua com o mesmo erro, ele da a impressão que fez o cadastro mas não realizada, inclusive se eu fechar a tela de cadastro e abrir ela novamente o ultimo dado gravado continua aparecendo nas textbox, porém quando saio do sistema ele não efetuou a gravação.
-
Luis, usuário e senha são os únicos campos obrigatórios desta tabela?
A chave primária está como Identity?
Porque se tiverem mais campos NOT NULL ou a chave primária não estiver como Identity, o INSERT não irá funcionar.
Att., Rafael Simor
-
-
-
-
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace Sistema_de_Gestão_Fialho_Corretora
{
public partial class Cadastro_Usuario : Form
{
SqlConnection conn = new SqlConnection("Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=C:\\Users\\CPU\\Desktop\\Software André\\Programa de Gestão Fialho Corretora\\Fialho Corretora\\BANCO DE DADOS\\db_usuario.mdf;Integrated Security=True");
SqlCommand cmd;
public Cadastro_Usuario()
{
InitializeComponent();
}
private void Cadastro_Usuario_Load(object sender, EventArgs e)
{
cmd.Connection = conn;
}
private void btn_cadastrar_Click(object sender, EventArgs e)
{
if (txt_usuario.Text != "" & txt_senha.Text != "")
{
conn.Open();
cmd = new SqlCommand("INSERT INTO tbl_usuario VALUES(@usuario, @senha)", conn);
cmd.Parameters.AddWithValue("@Usuario", txt_usuario.Text);
cmd.Parameters.AddWithValue("@Senha", txt_senha.Text);
int affectedRows = cmd.ExecuteNonQuery();
conn.Close();
txt_usuario.Enabled = false;
txt_senha.Enabled = false;
}
}
private void btn_novo_Click(object sender, EventArgs e)
{
txt_usuario.Enabled = true;
txt_senha.Enabled = true;
}
private void btn_editar_Click(object sender, EventArgs e)
{
txt_senha.Enabled = true;
}
}
} -
Luis, acredito que os parâmetros sejam CaseSensitive.
Tente deixar as linhas:
cmd.Parameters.AddWithValue("@usuario", txt_usuario.Text); cmd.Parameters.AddWithValue("@senha", txt_senha.Text);
Com os parâmetros em minúsculo.
Att., Rafael Simor
- Marcado como Resposta Levi DomingosModerator terça-feira, 26 de janeiro de 2016 17:43
-
-
-
-
Luis, mantenha as alterações sugeridas pela gente, porém altere isso:
if (!String.IsNullOrEmpty(txt_usuario.Text) && !String.IsNullOrEmpty(txt_senha.Text))
Att., Rafael Simor
- Marcado como Resposta Levi DomingosModerator terça-feira, 26 de janeiro de 2016 17:43
-
-
Luis, tente o seguinte:
public partial class Cadastro_Usuario : Form { private SqlConnection conn; SqlCommand cmd; public Cadastro_Usuario() { InitializeComponent(); } private void Cadastro_Usuario_Load(object sender, EventArgs e) { conn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\Simor\Downloads\André\Sistema de Gestão Fialho Corretora\Sistema de Gestão Fialho Corretora\db_usuario.mdf;Integrated Security=True;Connect Timeout=30"); } private void btn_cadastrar_Click(object sender, EventArgs e) { if (!String.IsNullOrEmpty(txt_usuario.Text) && !String.IsNullOrEmpty(txt_senha.Text)) { conn.Open(); cmd = new SqlCommand("Insert Into tbl_usuario (usuario, senha) Values(@usuario, @senha)",conn); cmd.Connection = conn; cmd.Parameters.AddWithValue("@usuario", txt_usuario.Text); cmd.Parameters.AddWithValue("@senha", txt_senha.Text); int affectedRows = cmd.ExecuteNonQuery(); conn.Close(); txt_usuario.Enabled = false; txt_senha.Enabled = false; } } private void btn_novo_Click(object sender, EventArgs e) { txt_usuario.Enabled = true; txt_senha.Enabled = true; } private void btn_editar_Click(object sender, EventArgs e) { txt_senha.Enabled = true; } }
Lembrando que alterei o caminho do .mdf para minha máquina, então atente-se a isso.
Algumas observações:
- Separe teu projeto em camadas.
- Não grave a senha em texto simples. Criptografe antes de gravar.
Att., Rafael Simor
- Marcado como Resposta Marcos SJ segunda-feira, 25 de janeiro de 2016 20:24
-
Rafael, fiz exatamente as alterações que você mencionou porém agora está aparecendo a seguinte mensagem de erro.
System.Data.SqlClient.SqlException não foi manipulada
Class=14
ErrorCode=-2146232060
HResult=-2146232060
LineNumber=65536
Message=An attempt to attach an auto-named database for file C:\\Users\\CPU\\Documents\\Visual Studio 2015\\Projects\\Sistema de Gestão Fialho Corretora\\Sistema de Gestão Fialho Corretora\\bd_fialhocorretora.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.
Number=15350
Procedure=""
Server=(LocalDB)\MSSQLLocalDB
Source=.Net SqlClient Data Provider
State=1
StackTrace:
em System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, DbConnectionPool pool, String accessToken, Boolean applyTransientFaultHandling)
em System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
em System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions)
em System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
em System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
em System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
em System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
em System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
em System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
em System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
em System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
em System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
em System.Data.SqlClient.SqlConnection.Open()
em Sistema_de_Gestão_Fialho_Corretora.Cadastro_Usuario.btn_cadastrar_Click(Object sender, EventArgs e) na C:\Users\CPU\Documents\Visual Studio 2015\Projects\Sistema de Gestão Fialho Corretora\Sistema de Gestão Fialho Corretora\Cadastro Usuario.cs:linha 33
em System.Windows.Forms.Control.OnClick(EventArgs e)
em System.Windows.Forms.Button.OnClick(EventArgs e)
em System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
em System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
em System.Windows.Forms.Control.WndProc(Message& m)
em System.Windows.Forms.ButtonBase.WndProc(Message& m)
em System.Windows.Forms.Button.WndProc(Message& m)
em System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
em System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
em System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
em System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
em System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
em System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
em System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
em System.Windows.Forms.Application.Run(Form mainForm)
em Sistema_de_Gestão_Fialho_Corretora.Program.Main() na C:\Users\CPU\Documents\Visual Studio 2015\Projects\Sistema de Gestão Fialho Corretora\Sistema de Gestão Fialho Corretora\Program.cs:linha 25
em System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
em System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
em Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
em System.Threading.ThreadHelper.ThreadStart_Context(Object state)
em System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
em System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
em System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
em System.Threading.ThreadHelper.ThreadStart()
InnerException:
-
Pessoal, muito obrigado pela ajuda de vocês, consegui resolver o problema.
Devo ter feito alguma coisa errada na tabela, pois tentei fazer da maneira que o Rafael me passou e não deu certo, então resolvi excluir a tabela e fazer ela novamente, após bater a cabeça algumas vezes, estava aparecendo a ultima mensagem que postei, após dar uma pausa para a cabeça descansar, fiquei mexendo um pouco e acabei descobrindo que tinha colocado o caminho do banco errado.
Rafael, muito obrigado pela atenção, você me ajudou muito.