none
comando update que não faz update mas também não da erro RRS feed

  • Pergunta

  • olá, to aqui de novo  pra encher o saco de vocês =D

    Então, o código abaixo não faz oque deveria fazer mas também não da erro, ai fico sem saber oque fazer. alguém poderia me dar uma luz para sai dessa ? 

     if (existeApontamentoNaData(dtRow[Convert.ToInt32(to.nome)].ToString(), dtRow[Convert.ToInt32(to.sT)].ToString(), dtRow[Convert.ToInt32(to.data)].ToString()) == true)
                            {
                                cmd.CommandText = "Update RelatorioSAP set Hours = @Hours where Nome = @Nome and Data = @Data and ShortText = @ShortText";
                                cmd.Parameters.AddRange(new OleDbParameter[]
                                {           
                                  new OleDbParameter("@Nome"       , nome ),
                                  new OleDbParameter("@Hours"      , horas),
                                  new OleDbParameter("@ShortText"  , st   ),
                                  new OleDbParameter("@Data"       , data ),
                                });
                                cmd.ExecuteNonQuery();

     
    terça-feira, 15 de outubro de 2013 17:55

Respostas

  • É mesmo testei aqui agora, olha o que eu faria era pegar montar esta sua query

    e pegar todos estes parâmetros e jogar em uma variável tipo assim

    //aqui vc tem seu método com os paramet..
    dtRow[Convert.ToInt32(to.nome)].ToString(), dtRow[Convert.ToInt32(to.sT)].ToString(), dtRow[Convert.ToInt32(to.data)].ToString()) == true)
                            {
    
    //faz tipo assim :
    int a = Convert.ToInt32(to.nome)].ToString();
    int b = dtRow[Convert.ToInt32(to.sT).......
    
    //na sua query faria isso
    string query = "UPDATE ........
    SET Nome = a, sT = b 
    //e testava direto no access esta string montada 
    //pq com certeza o erro esta no seu parâmetros 
    //faz isso q vc consegue ver parâmetro por parâmetro ai 
    //descobre o erro

    • Marcado como Resposta Guilherme Gamboa quinta-feira, 17 de outubro de 2013 13:03
    quarta-feira, 16 de outubro de 2013 17:18
  • O método ExecuteNonQuery retorna um int representando o numero de colunas afetadas. Verifica o que ele está retornando, se retornar 0 é porque o where não encontrou nada, se retornar algum outro valor é sinal que o update foi realizado com sucesso!

    Abraço!

    • Marcado como Resposta Guilherme Gamboa quinta-feira, 17 de outubro de 2013 13:03
    quarta-feira, 16 de outubro de 2013 17:24
  • oi gente muito obrigado pela ajuda, o problema estava na Query mesmo eu acho. Mudei o codigo e funcionou pelo menos por enquanto. kkkkkk

     cmd.CommandText = "Update RelatorioSAP set Hours = '" +horas +
                                                  "' where Nome = '" + nome +
                                                  "' and Data = '" + data +
                                                  "' and ShortText = '" + st +
                                                  "';";
    
                                cmd.ExecuteNonQuery();
                            }

     
    • Marcado como Resposta Guilherme Gamboa quinta-feira, 17 de outubro de 2013 14:50
    quinta-feira, 17 de outubro de 2013 13:06

Todas as Respostas

  • Guilherme Gamboa

    Vc se certificou que os parâmetro passados no where são verdadeiros.... Nome ,Data e ShortText  ??????


    Diego Almeida Barreto
    System Analyst / Software Developer

    terça-feira, 15 de outubro de 2013 18:58
  • olá, to aqui de novo  pra encher o saco de vocês =D

    Então, o código abaixo não faz oque deveria fazer mas também não da erro, ai fico sem saber oque fazer. alguém poderia me dar uma luz para sai dessa ? 

     if (existeApontamentoNaData(dtRow[Convert.ToInt32(to.nome)].ToString(), dtRow[Convert.ToInt32(to.sT)].ToString(), dtRow[Convert.ToInt32(to.data)].ToString()) == true)
                            {
                                cmd.CommandText = "Update RelatorioSAP set Hours = @Hours where Nome = @Nome and Data = @Data and ShortText = @ShortText";
                                cmd.Parameters.AddRange(new OleDbParameter[]
                                {           
                                  new OleDbParameter("@Nome"       , nome ),
                                  new OleDbParameter("@Hours"      , horas),
                                  new OleDbParameter("@ShortText"  , st   ),
                                  new OleDbParameter("@Data"       , data ),
                                });
                                cmd.ExecuteNonQuery();

     

    Guilherme, se você fizer um select nesta tabela com essas clausulas Where, retorna algum valor?

    Julio Arruda
    __________________________________________
    Se foi util, marque como resposta
    .Net Coders
    Coordenador .Net Coders

    terça-feira, 15 de outubro de 2013 19:13
  • sim, O método exixteApontamentoNaData verifica se o registro já existe se ele existir ai eu faço esse update se não faço um INSERT
    terça-feira, 15 de outubro de 2013 19:15
  • public void carregarTabela(RelatorioSAP_TO to, ProgressBar bar) { try { string nome, data, st; int horas; OleDbConnection conn = new OleDbConnection(("Provider=Microsoft.ACE.OLEDB.12.0; " + ("data source=" + to.diretorio + "; " + "Extended Properties=Excel 12.0;"))); OleDbDataAdapter ada = new OleDbDataAdapter("select * from [" + to.nomeSheet + "$]", conn); DataSet ds = new DataSet(); ada.Fill(ds); conn.Close(); OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + @"C:\Program Files (x86)\Consolidador De Horas\BamcoDeDados\BbConsolida.accdb"); myConnection.Open(); string queryString = "SELECT * into RelatorioSAP from [" + to.nomeSheet + "$]"; OleDbDataAdapter adapter = new OleDbDataAdapter(queryString, myConnection); System.Data.DataTable dtAccess = new System.Data.DataTable(); System.Data.DataTable dtCSV = new System.Data.DataTable(); dtCSV = ds.Tables[0]; bar.Maximum = dtCSV.Rows.Count; foreach (DataRow dtRow in dtCSV.Rows) { dtRow[to.hours] = dtRow[to.hours].ToString().Replace(".", ","); } foreach (DataRow dtRow in dtCSV.Rows) { nome = dtRow[Convert.ToInt32(to.nome)].ToString().Trim(); horas = Convert.ToInt32( dtRow[Convert.ToInt32(to.hours)].ToString().Trim()); st = dtRow[Convert.ToInt32(to.sT)].ToString().Trim(); data = dtRow[Convert.ToInt32(to.data)].ToString().Trim(); bar.Increment(1); using (OleDbCommand cmd = myConnection.CreateCommand()) { if (existeApontamentoNaData(dtRow[Convert.ToInt32(to.nome)].ToString(), dtRow[Convert.ToInt32(to.sT)].ToString(), dtRow[Convert.ToInt32(to.data)].ToString()) == true) { cmd.CommandText = "Update RelatorioSAP set Hours = @Hourks where Nome = @Nome and Data = @Data and ShortText = @ShortText"; cmd.Parameters.AddRange(new OleDbParameter[] { new OleDbParameter("@Nome" , nome ), new OleDbParameter("@Hours" , horas), new OleDbParameter("@ShortText" , st ), new OleDbParameter("@Data" , data ), }); cmd.ExecuteNonQuery(); } else { cmd.CommandText = "INSERT INTO RelatorioSAP" + "(Nome, Hours, ShortText, Data,WBS_element, DataDaCarga) " + "VALUES(@Nome,@Hours, @ShortText, @Data, @WBS_element,@DataDaCarga)"; cmd.Parameters.AddRange(new OleDbParameter[] { new OleDbParameter("@Nome" , dtRow[Convert.ToInt32(to.nome)]), new OleDbParameter("@Hours" , dtRow[Convert.ToInt32(to.hours)]), new OleDbParameter("@ShortText" , dtRow[Convert.ToInt32(to.sT)]), new OleDbParameter("@Data" , dtRow[Convert.ToInt32(to.data)]), new OleDbParameter("@WBS_element", dtRow[Convert.ToInt32(to.wbs)]), new OleDbParameter("@DataDaCarga", DateTime.Now.Date) }); cmd.ExecuteNonQuery(); } } } bar.Value = 0; myConnection.Close(); } catch (Exception ex) { MessageBox.Show("Erro no metodo que carrega a tabela para o banco de dados. Erro : " + ex.Message); } }

    terça-feira, 15 de outubro de 2013 19:16
  • Guilherme,

    posta o conteúdo de

    existeApontamentoNaData


    Julio Arruda
    __________________________________________
    Se foi util, marque como resposta
    .Net Coders
    Coordenador .Net Coders

    terça-feira, 15 de outubro de 2013 19:21
  • public bool existeApontamentoNaData(String sNome, String sSt, String dDataApontamento)
            {
                Cl_con.abrirConexao();
                bool x = false;
                OleDbCommand cmd;
                string sql;
                System.Data.DataTable Data;
                Data = new System.Data.DataTable("RelatorioSAP");
                try
                {
                sql = "Select *from RelatorioSAP Where Nome = @Nome and ShortText = @ShortText and Data = @Data;";
                cmd = new OleDbCommand(sql, Cl_con.conexao);
                cmd.Parameters.AddRange(new OleDbParameter[]
                                {           
                                  new OleDbParameter("@Nome"       , sNome            ),
                                  new OleDbParameter("@ShortText"  , sSt              ),
                                  new OleDbParameter("@Data"       , dDataApontamento ),
                                });

                OleDbDataReader reader = cmd.ExecuteReader();
                if (reader.HasRows)
                {
                    x = true;
                }
                else
                {
                    x = false;
                }
                Cl_con.fecharConexao();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Erro no metodo que verifica se o registros ja existe na tabela. Erro : " + ex,"Erro no consolidador", MessageBoxButtons.OK,MessageBoxIcon.Error );
                }
                return x;

            }
    terça-feira, 15 de outubro de 2013 19:24
  • cara, estou tentando enxergar um erro aqui, mais não consigo.

    tenta uma coisa ai que vi que esta diferente dos demais

    no update, você passa variáveis assim

                      new OleDbParameter("@Nome"       , nome ),
                                 
    new OleDbParameter("@Hours"      , horas),
                                 
    new OleDbParameter("@ShortText"  , st   ),
                                 
    new OleDbParameter("@Data"       , data ),

    tente fazer da mesma maneira que os demais procedimentos que está fazendo

                                  new OleDbParameter("@Nome"       , dtRow[Convert.ToInt32(to.nome)]), new OleDbParameter("@Hours"      , dtRow[Convert.ToInt32(to.hours)]),
                                 
    new OleDbParameter("@ShortText"  , dtRow[Convert.ToInt32(to.sT)]),
                                 
    new OleDbParameter("@Data"       , dtRow[Convert.ToInt32(to.data)]),
                                 
    new OleDbParameter("@WBS_element", dtRow[Convert.ToInt32(to.wbs)]),


    Julio Arruda
    __________________________________________
    Se foi util, marque como resposta
    .Net Coders
    Coordenador .Net Coders

    • Sugerido como Resposta Julio ArrudaMVP terça-feira, 15 de outubro de 2013 19:44
    terça-feira, 15 de outubro de 2013 19:44
  • eu passava por esse modo mas mudei para variáveis pois achava que os valores estavam vindo com espaços em branco, mas não adiantou ele continua não fazendo o update 
    quarta-feira, 16 de outubro de 2013 12:57
  • teria algum modo de ver se os @Valores estão sendo subsistidos ? tipo o Shift f9  
    quarta-feira, 16 de outubro de 2013 13:41
  • Olhe a sua query no momento do executeNonquery e veja se os parâmetros esta correto e execute esta query

    no Management do sql e você verá o erro.

    quarta-feira, 16 de outubro de 2013 14:01
  • daniel System

    vc poderia me explicar melhor, não sei fazer isso.

    ahhh uma onformação que esqueci de falar eh que to usando Access como banco. 

    quarta-feira, 16 de outubro de 2013 14:30
  • Neste momento :

       cmd.ExecuteNonQuery();
     use shift F9 como você mesmo disse ou passe o mouse sobre e aperte o + e veja como esta a sua query

    quarta-feira, 16 de outubro de 2013 16:12
  • shift F9 mostra isso :cmd.ExecuteNonQuery(); 0 int

    que é a quantidade de linhas afetas no caso 0 

    quarta-feira, 16 de outubro de 2013 16:52
  • É mesmo testei aqui agora, olha o que eu faria era pegar montar esta sua query

    e pegar todos estes parâmetros e jogar em uma variável tipo assim

    //aqui vc tem seu método com os paramet..
    dtRow[Convert.ToInt32(to.nome)].ToString(), dtRow[Convert.ToInt32(to.sT)].ToString(), dtRow[Convert.ToInt32(to.data)].ToString()) == true)
                            {
    
    //faz tipo assim :
    int a = Convert.ToInt32(to.nome)].ToString();
    int b = dtRow[Convert.ToInt32(to.sT).......
    
    //na sua query faria isso
    string query = "UPDATE ........
    SET Nome = a, sT = b 
    //e testava direto no access esta string montada 
    //pq com certeza o erro esta no seu parâmetros 
    //faz isso q vc consegue ver parâmetro por parâmetro ai 
    //descobre o erro

    • Marcado como Resposta Guilherme Gamboa quinta-feira, 17 de outubro de 2013 13:03
    quarta-feira, 16 de outubro de 2013 17:18
  • O método ExecuteNonQuery retorna um int representando o numero de colunas afetadas. Verifica o que ele está retornando, se retornar 0 é porque o where não encontrou nada, se retornar algum outro valor é sinal que o update foi realizado com sucesso!

    Abraço!

    • Marcado como Resposta Guilherme Gamboa quinta-feira, 17 de outubro de 2013 13:03
    quarta-feira, 16 de outubro de 2013 17:24
  • oi gente muito obrigado pela ajuda, o problema estava na Query mesmo eu acho. Mudei o codigo e funcionou pelo menos por enquanto. kkkkkk

     cmd.CommandText = "Update RelatorioSAP set Hours = '" +horas +
                                                  "' where Nome = '" + nome +
                                                  "' and Data = '" + data +
                                                  "' and ShortText = '" + st +
                                                  "';";
    
                                cmd.ExecuteNonQuery();
                            }

     
    • Marcado como Resposta Guilherme Gamboa quinta-feira, 17 de outubro de 2013 14:50
    quinta-feira, 17 de outubro de 2013 13:06