Array
(
)

Problemas para fazer o Update no banco de dados utilizando Asp Net + C sharp

Ricardo
   - 30 nov 2015

Bom dia, sou iniciante em programação e estou desenvolvendo uma aplicação utilizando Asp .Net e C#.
Estou com um problema para realizar a atualização dos dados do banco de dados, acho que falta um post back em algum lugar ou algo assim. Os registros da minha aplicação são exibidos em um Grid View, eu coloquei um botão no grid para selecionar os dados e coloca-los nos texts box e é ai que vem um dos problemas. Me falaram para nunca manipular os dados diretamente do grid, que era melhor eu usar um dataset para isso.
Fiz quase toda a programação em C#, por enquanto utilizei Asp apenas para formatar o grid e acertar o panels.
O principal problema é não conseguir atualizar os dados no banco de dado, quando eu executo o método, ele diz que os dados foram alterados, mas continuam do mesmo jeito, por algum motivo ele não está passando os novos valores dos text box para as minhas variáveis..
Outro problema, é que quando vou realizar a alteração os drop down list não são populados, eles recebem apenas o valor da linha selecionada, e apenas uma vez, pois se eu selecionar outra linha os valores dos DDL não sofrem alteração.
Vamos aos códigos:
GRID VIEW - ASP
#Código

<asp:GridView ID="GridPrincipal" runat="server" CellPadding="4" ForeColor="#333333" GridLines="None" OnSelectedIndexChanged="GridPrincipal_SelectedIndexChanged" AutoGenerateColumns="False">
            <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
            <Columns>
                <%-- Botão para selecionar a linha... --%>
                <asp:CommandField ButtonType="Button" ShowSelectButton="True"/>
                <%--
                    CRIANDO AS COLUNAS DO GRID VIEW e formatando para exibição da DATA sem a HORA
                    Desabilitar a criação automatica de colunas (AutoGenerateColumns="False")
                 --%>
                <asp:BoundField HeaderText="ID" DataField="ID" />
                <asp:BoundField HeaderText="Nome" DataField="Nome" />
                <asp:BoundField HeaderText="Nº Registro" DataField="Nº Registro" />
                <asp:BoundField HeaderText="Ramal" DataField="Ramal" />
                <asp:BoundField HeaderText="Área" DataField="Área" />
                <asp:BoundField HeaderText="Cargo" DataField="Cargo" />
                <asp:BoundField HeaderText="Empregador" DataField="Empregador" />
                <asp:BoundField HeaderText="Admissão" DataField="Data de Admissão"  DataFormatString="{0:dd/MM/yyyy}" />
                <asp:BoundField HeaderText="Hr Entra" DataField="Hr Entra" />
                <asp:BoundField HeaderText="Hr Sai" DataField="Hr Sai" />
                <asp:BoundField HeaderText="Nascimento" DataField="Data Nascimento"  DataFormatString="{0:dd/MM/yyyy}" />
                <asp:BoundField HeaderText="Atualizado" DataField="Atualizado_em"  DataFormatString="{0:dd/MM/yyyy}" />
            </Columns>

            <EditRowStyle BackColor="#999999" />

            <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
            <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
            <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
            <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
            <SelectedRowStyle BackColor="#E2DED6" ForeColor="#333333" Font-Bold="True" />
            <SortedAscendingCellStyle BackColor="#E9E7E2" />
            <SortedAscendingHeaderStyle BackColor="#506C8C" />
            <SortedDescendingCellStyle BackColor="#FFFDF8" />
            <SortedDescendingHeaderStyle BackColor="#6F8DAE" />
        </asp:GridView>

GRID VIEW - C# - envio dos valores para os text box
#Código
protected void GridPrincipal_SelectedIndexChanged(object sender, EventArgs e)
        {
            //limpando todos os campos do formulario
            LimpaCampos(this);
            //LimpaCombos(this); // Ver como limpar os combos!!!

            Funcionarios teste = new Funcionarios();
            teste.PopTxt();
            txtNome.Text = teste._Nome;
            txtRamal.Text = Convert.ToString (teste._Ramal);
            txtNreg.Text = Convert.ToString (teste._NrReg);

            //populando os combos

            //Empregador emp = new Empregador();
            //ddlEmpregador.DataSource = emp.ListaEmpregador();
            //ddlEmpregador.DataBind();

            //CargoFunc cf = new CargoFunc();
            //ddlCargo.DataSource = cf.ListaCargo();
            //ddlCargo.DataBind();

            //AreaFunc af = new AreaFunc();
            //ddlArea.DataSource = af.ListaArea();
            //ddlArea.DataBind();

            try
            {
                //colocando os valores do grid view nos text box do PANEL
                lblID.Text = ("ID: " + GridPrincipal.SelectedRow.Cells[1].Text + " (uso interno)");
                txtNome.Text = GridPrincipal.SelectedRow.Cells[2].Text;
                txtNreg.Text = GridPrincipal.SelectedRow.Cells[3].Text;
                txtRamal.Text = GridPrincipal.SelectedRow.Cells[4].Text;
                ddlEmpregador.Items.Add(GridPrincipal.SelectedRow.Cells[7].Text);
                   // ddlEmpregador.SelectedIndex.ToString(GridPrincipal.SelectedRow.Cells[7].Text);
                   // ddlArea.SelectedIndex.ToString(GridPrincipal.SelectedRow.Cells[5].Text);
                ddlArea.Items.Add(GridPrincipal.SelectedRow.Cells[5].Text);
                ddlCargo.Items.Add(GridPrincipal.SelectedRow.Cells[6].Text);
                  //  ddlCargo.SelectedIndex.ToString(GridPrincipal.SelectedRow.Cells[6].Text);
                txtDataAdm.Text = GridPrincipal.SelectedRow.Cells[8].Text;
                //se o text box estiver formatado como datetime ele é preenchido com os dados da tabela.
                //formatar a exibição do griview para ver se isso vai funcionar....
                txtDataNasc.Text = GridPrincipal.SelectedRow.Cells[11].Text;
                txtHrEntra.Text = GridPrincipal.SelectedRow.Cells[9].Text;
                txtHrSai.Text = GridPrincipal.SelectedRow.Cells[10].Text;


                //habilitando e desabilitando os botões
                btnExcluiFunc.Enabled = true;
                btnUpdade.Enabled = true;
                btnSave.Enabled = false;
            }
            catch (Exception ex)
            {
                lblStatus.Text = ("Erro: " + ex);
            }

MÉTODO UTILIZADO PARA FAZER O UPDATE - o comando está em uma linha continua pq quando eu quebrei a linha o comando não funcionou, mesmo concatenando..
#Código
public void AlteraFuncionarios()
        {
            string strAlt = ("update Funcionarios set Nome_Func = @nomefunc, Ramal_Func =  @ramalfunc, DT_Nasc = @dtnasc, DT_Adm = @dtadm, HR_Entra = @hrentra, HR_Sai = @hrsai, DT_Ultima_Atu = @dtatu, Area_Func = @areafunc, Cargo_Func = @cargofunc, Empregador_Func = @empregadorfunc where ID_Func = @idfunc");

            SqlParameter Pidfunc = new SqlParameter();
            Pidfunc.ParameterName = "@idfunc";
            Pidfunc.Value = _ID;

            SqlParameter Pnomefunc = new SqlParameter();
            Pnomefunc.ParameterName = "@nomefunc";
            Pnomefunc.Value = _Nome;

            SqlParameter Pramalfunc = new SqlParameter();
            Pramalfunc.ParameterName = "@ramalfunc";
            Pramalfunc.Value = _Ramal;

            SqlParameter Pdtnasc = new SqlParameter();
            Pdtnasc.ParameterName = "@dtnasc";
            Pdtnasc.Value = _DtNasc;

            SqlParameter Pdtadm = new SqlParameter();
            Pdtadm.ParameterName = "@dtadm";
            Pdtadm.Value = _DtAdm;

            SqlParameter Phrentra = new SqlParameter();
            Phrentra.ParameterName = "@hrentra";
            Phrentra.Value = _HrEntra;

            SqlParameter Phrsai = new SqlParameter();
            Phrsai.ParameterName = "@hrsai";
            Phrsai.Value = _HrSai;

            SqlParameter Pdtatu = new SqlParameter();
            Pdtatu.ParameterName = "@dtatu";
            Pdtatu.Value = _DtAtu;

            SqlParameter Pareafunc = new SqlParameter();
            Pareafunc.ParameterName = "@areafunc";
            Pareafunc.Value = _Area;

            SqlParameter Pcargofunc = new SqlParameter();
            Pcargofunc.ParameterName = "@cargofunc";
            Pcargofunc.Value = _Cargo;

            SqlParameter Pempregadorfunc = new SqlParameter();
            Pempregadorfunc.ParameterName = "@empregadorfunc";
            Pempregadorfunc.Value = _Empregador;

            //Abre conexão
            SqlConnection conn = ConetaBD.AbreConn();

            //Cria o comando a ser executado
            SqlCommand cmdAlt = new SqlCommand(strAlt, conn);

            cmdAlt.Parameters.Add(Pidfunc);
            cmdAlt.Parameters.Add(Pnomefunc);
            cmdAlt.Parameters.Add(Pramalfunc);
            cmdAlt.Parameters.Add(Pdtnasc);
            cmdAlt.Parameters.Add(Pdtadm);
            cmdAlt.Parameters.Add(Phrentra);
            cmdAlt.Parameters.Add(Phrsai);
            cmdAlt.Parameters.Add(Pdtatu);
            cmdAlt.Parameters.Add(Pareafunc);
            cmdAlt.Parameters.Add(Pcargofunc);
            cmdAlt.Parameters.Add(Pempregadorfunc);

            //executa o comando
            cmdAlt.ExecuteNonQuery();

        }

CHAMANDO O MÉTODO NA APLICAÇÃO - o comando é executado e é exibida a msg de dados atualizados, ma não muda nada no banco... por algum motivo ele não está passando os novos valores dos text box para as minhas variáveis...
#Código
protected void btnUpdade_Click(object sender, EventArgs e)
        {
            Funcionarios func = new Funcionarios();

            func._Nome = Convert.ToString(txtNome.Text); 
            func._NrReg = Convert.ToInt32(txtNreg.Text);
            func._Ramal = Convert.ToInt32(txtRamal.Text);
            func._Empregador = this.ddlEmpregador.SelectedIndex; //Convert.ToInt32(ddlEmpregador.SelectedValue);//está retornando uma string...
            func._Cargo = this.ddlCargo.SelectedIndex; //Convert.ToInt32(ddlCargo.SelectedValue);
            func._Area = this.ddlArea.SelectedIndex; //Convert.ToInt32(ddlArea.SelectedValue);
            func._HrEntra = Convert.ToDateTime(txtHrEntra.Text);
            func._HrSai = Convert.ToDateTime(txtHrSai.Text);
            func._DtNasc = Convert.ToDateTime(txtDataNasc.Text);
            func._DtAdm = Convert.ToDateTime(txtDataAdm.Text);
            func._DtAtu = DateTime.Now;

            try
            {
                func.AlteraFuncionarios();
                lblStatus.Text = ("Dados Atualizados!!!");

                //atualizar grid... Não está funcionando....
                GridPrincipal.DataSource = func.ListaFuncionarios();
                GridPrincipal.DataBind();
            }
            catch (Exception ex)
            {
                lblStatus.Text = ("Erro na atulização: " + ex);
            }

        }

Obrigado!

Ricardo
   - 07 dez 2015

Encontrei um dos problemas...

Eu não estava passando o ID para ele saber onde alterar o registro, porem, agora ele não está encontrando o valor (SelectedValue) do DDL.

Tenho 3 campos que são preenchidos com dados dos DDL, esses campos são Área, Cargo e Empregador, e possuo uma tabela no banco de dados para cada um deles, quando salvo ele na minha tabela Funcionarios, passo apenas o ID deles. No select que fiz para exibição no Grid View coloquei para exibir o nome ao invés d ID, e quando vou alterar os itens da problema com isso, por que ele não passa o ID para o comando, ele está passando o nome ou algo assim..

O erro que está dando é o seguinte:
#Código

 Erro na atulização: System.Data.SqlClient.SqlException (0x80131904): Invalid column name 'nome_empregador'. at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at SisFunc_v1.Funcionarios.ValArea() in c:\Users\Admin\Documents\Visual Studio 2012\Projects\SisFunc_v1\SisFunc_v1\Funcionarios.cs:line 455 at SisFunc_v1.CadFunc.btnUpdade_Click(Object sender, EventArgs e) in c:\Users\Admin\Documents\Visual Studio 2012\Projects\SisFunc_v1\SisFunc_v1\CadFunc.aspx.cs:line 403 ClientConnectionId:27a48997-9edc-49ac-8a77-d06e7116a59d Error Number:207,State:1,Class:16  


Estou adicionando o valor no ddl assim: #Código
func._Empregador = this.ddlEmpregador.SelectedIndex;


Mas as outras opções dos DDLs não são carregadas, ele fica apenas com o item que está no grid...

Alguma sugestão do que eu posso fazer para arrumar isso?

Obrigado!

Ricardo
   - 07 dez 2015

O comando para colocar o valor no DDL é o seguinte:
#Código

ddlEmpregador.Items.Add(GridPrincipal.SelectedRow.Cells[7].Text);


O comando #Código
func._Empregador = this.ddlEmpregador.SelectedIndex;
é como estou passando para o método q realiza o update.