none
Cadastrar dados no banco SQL RRS feed

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

    domingo, 24 de janeiro de 2016 21:15

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
    segunda-feira, 25 de janeiro de 2016 17: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
    domingo, 24 de janeiro de 2016 23:22
  • 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

    segunda-feira, 25 de janeiro de 2016 15:41
  • 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

    segunda-feira, 25 de janeiro de 2016 16:30

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
    domingo, 24 de janeiro de 2016 23:22
  • 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/

    domingo, 24 de janeiro de 2016 23:48
  • 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é

    segunda-feira, 25 de janeiro de 2016 12:07
  • 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/

    segunda-feira, 25 de janeiro de 2016 12:13
  • 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.
    segunda-feira, 25 de janeiro de 2016 14:57
  • 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

    segunda-feira, 25 de janeiro de 2016 15:02
  • Posta aki o codigo completo que estas a usar por favor...

    o problema nao esta na conecao, esta no codigo....posta aki o codigo...


    A flower cannot blossom without sunshine, and man cannot live without love.

    segunda-feira, 25 de janeiro de 2016 15:28
    Moderador
  • Rafael

    a tabela tem apenas 3 campos, id, usuario e senha.

    Id é a chave primaria e está como Identity.

    Usuario e senha estão como Not Null.

    segunda-feira, 25 de janeiro de 2016 15:31
  • posta aki o codigo....please

    A flower cannot blossom without sunshine, and man cannot live without love.

    segunda-feira, 25 de janeiro de 2016 15:33
    Moderador
  • 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;
            }
        }
    }
    segunda-feira, 25 de janeiro de 2016 15:37
  • 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

    segunda-feira, 25 de janeiro de 2016 15:41
  • Rafael, alterei os parametros, como você sugeriu, porém continua o mesmo erro.

    segunda-feira, 25 de janeiro de 2016 16:01
  • O teu insert esta errado, voce tem de mencionar os campos da tabela...

    faz assim:

    Insert Into tbl_usuario (usuario, senha) Values(@usuario, @senha)


    A flower cannot blossom without sunshine, and man cannot live without love.

    segunda-feira, 25 de janeiro de 2016 16:09
    Moderador
  • Fiz a alteração mencionada, mas continua do mesmo modo.
    segunda-feira, 25 de janeiro de 2016 16:22
  • 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

    segunda-feira, 25 de janeiro de 2016 16:30
  • pessoal eu fiz a alteração mencionada e nada, continua da mesma forma.

    para facilitar a analise de você segue link com minha aplicação

    https://www.dropbox.com/s/hh09xg9p2m8ps7s/Andr%C3%A9.rar?dl=0

    segunda-feira, 25 de janeiro de 2016 16:58
  • 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
    segunda-feira, 25 de janeiro de 2016 17: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: 

    segunda-feira, 25 de janeiro de 2016 20:56
  • 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.


    terça-feira, 26 de janeiro de 2016 00:36