0

以下のコードがあり、ForEach ループに入ると、エラーが発生します。

私はこれを読みました

スタックオーバーフロー

しかし、それをしませんでした =\ 何を変更する必要があるかを知る必要があります。MySqlCommand を移動しようとしましたが、問題を解決できませんでした... 3 つの異なる方法 (選択、挿入、更新) がありましたが、「トランザクション」を使用する必要があったため、3 つの方法を同時に配置しました... 初めて正常に動作しますが、エラーが発生した 2 番目のループがINSERT QUERYで発生します

#region Querys
        string Select = @"SELECT id_convidado, nome, cod_dependente, dt_insercao, matricula FROM convidado_acesso WHERE debpag = 0 AND status <> 'Devolvido'";

        string Insert = @"INSERT INTO debpag (
                     numero_int,
                     parcela,
                     tipo_pessoa,
                     matricula,
                     cod_dependente,
                     ev_financeiro,
                     quantidade,
                     valor_unitario,
                     valor_total,
                     dt_lancamento,
                     dt_vencimento,
                     dt_pagamento,
                     dt_insercao,
                     dt_insercao_pagamento,
                     referencia,
                     cobrador_lancto,
                     cobrador_pagto,
                     usr_lancto,
                     forma_pagto)
                     VALUES (
                     @numero_int,
                     @parcela,
                     @tipo_pessoa,
                     @matricula,
                     @cod_dependente,
                     @ev_financeiro,
                     @quantidade,
                     @valor_unitario,
                     @valor_total,
                     @dt_lancamento,
                     @dt_vencimento,
                     @dt_pagamento,
                     @dt_insercao,
                     @dt_insercao_pagamento,
                     @referencia,
                     @cobrador_lancto,
                     @cobrador_pagto,
                     @usr_lancto,
                     @forma_pagto)";

        string Update = "UPDATE convidado_acesso SET dt_saida = @dt_saida, usr_saida= @usr_saida, status= @status, debpag = @deb WHERE nome = @nome AND debpag = 0";
        #endregion

        #region MySql
        MySqlConnection conexao = conexao = new MySqlConnection("Server= localhost; Database = crdores; Uid= root;Pwd = ik9rru2j;Allow Zero Datetime = true");
        MySqlCommand cmd = new MySqlCommand();
        cmd.Connection = conexao;
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = Select;
        MySqlDataAdapter da = new MySqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        da.Fill(ds);
        conexao.Open();
        ta = conexao.BeginTransaction();

        #endregion


        try
        {
            #region TratamentoSelect


            List<Convidado> convidado = null;
            Convidado retorno = null;
            if ((ds.Tables.Count > 0) && (ds.Tables[0].Rows.Count > 0))
            {
                convidado = new List<Convidado>();
                foreach (DataRow row in ds.Tables[0].Rows)
                {



                    string status = "";
                    int deb = 0;

                    retorno = new Convidado();
                    try
                    {
                        retorno.Nome = row["nome"].ToString();
                    }
                    catch { }
                    try
                    {
                        retorno.Cod_Dep = Convert.ToInt32(row["cod_dependente"]);
                    }
                    catch { }
                    try
                    {
                        retorno.Dt_Insercao = Convert.ToDateTime(row["dt_insercao"]);
                    }
                    catch { }
                    try
                    {
                        retorno.Matricula = Convert.ToInt32(row["matricula"]);
                    }
                    catch { }
                    try
                    {
                        retorno.Id_Convidado = Convert.ToInt32(row["id_convidado"]);
                    }
                    catch { }

                    #region Variaveis


                    string tmp = BuscaTempoLimite();
                    int z = tmp.Length;
                    string h = tmp.Remove(1, z - 1);
                    string m = tmp.Remove(0, 2);

                    string saida = BuscaHoraServidor();
                    retorno.Dt_Insercao = retorno.Dt_Insercao.AddMinutes(15);
                    string entrada = retorno.Dt_Insercao.ToString("HH:mm");
                    DateTime insercao = Convert.ToDateTime(retorno.Dt_Insercao);
                    DateTime left = Convert.ToDateTime(saida);
                    saida = left.ToString("HH:mm");

                    int horaEntrada = Convert.ToInt32(entrada.Remove(2, 3));
                    int minutosEntrada = Convert.ToInt32(entrada.Remove(0, 3));
                    int horaSaida = Convert.ToInt32(saida.Remove(2, 3));
                    int minutosSaida = Convert.ToInt32(saida.Remove(0, 3));
                    TimeSpan first = new TimeSpan(horaEntrada, minutosEntrada, 0);
                    TimeSpan last = new TimeSpan(horaSaida, minutosSaida, 0);
                    TimeSpan result = last - first;
                    TimeSpan limite = new TimeSpan(Convert.ToInt32(h), Convert.ToInt32(m), 59);

                    int hora = last.Hours - first.Hours;
                    int minutosss = last.Minutes - first.Minutes;

                    result = new TimeSpan(hora, minutosss, 0);
                    #endregion

                    if (left.Day <= insercao.Day)
                    {
                        if (result > limite)
                        {
                            status = "Pago";
                            deb = 0;
                        }
                        else
                        {
                            status = "Devolvido";
                            deb = 2;
                        }
                    }
                    else
                    {
                        status = "Pago";
                    }



            #endregion

                    #region TratamentoInsert

                    cmd.CommandText = Insert;

                    #region váriaveis
                    int cash = 0;
                    string eventoF = "", usre = "", cobrador = "", tmpLimite = "";
                    int ide = 0;
                    ide = PegaMaxID();
                    string insercao_pagto;
                    string dt_lancamento = BuscaHoraServidor();
                    string saidaa = VerificaSaida(Convert.ToInt32(retorno.Id_Convidado));
                    string referencia = retorno.Dt_Insercao.ToString("MM/yyyy");
                    if (saida != "")
                    {
                        insercao_pagto = saida;
                    }
                    else
                    {
                        insercao_pagto = BuscaHoraServidor();
                    }

                    int tipo_pessoa;
                    if (retorno.Cod_Dep > 0)
                    {
                        tipo_pessoa = 3;
                    }
                    else
                    {
                        tipo_pessoa = 1;
                    }

                    retorno.Dt_Insercao = retorno.Dt_Insercao.AddHours(1);
                    retorno.Dt_Insercao = retorno.Dt_Insercao.AddMinutes(15);
                    retorno.Dt_Insercao = retorno.Dt_Insercao.AddSeconds(59);
                    string ent = retorno.Dt_Insercao.ToString("dd/MM/yyyy");
                    #endregion

                    DataSet confg = pag.BuscaConfigs();
                    foreach (DataRow roww in confg.Tables[0].Rows)
                    {
                        eventoF = roww["ev_financeiro"].ToString();
                        cash = Convert.ToInt32(roww["valor"]);
                        usre = roww["usr_insercao"].ToString();
                        tmpLimite = roww["tempo_permanencia"].ToString();
                        cobrador = roww["cod_cobrador"].ToString();
                    }

                    cmd.Parameters.Add(new MySqlParameter("@numero_int", MySqlDbType.Int32)).Value = ide + 1; **//HERE THE ERROR STARTS**
                    cmd.Parameters.Add(new MySqlParameter("@parcela", MySqlDbType.VarChar)).Value = "1/1";
                    cmd.Parameters.Add(new MySqlParameter("@tipo_pessoa", MySqlDbType.Int32)).Value = tipo_pessoa;
                    cmd.Parameters.Add(new MySqlParameter("@matricula", MySqlDbType.Int32)).Value = retorno.Matricula;
                    cmd.Parameters.Add(new MySqlParameter("@cod_dependente", MySqlDbType.Int32)).Value = retorno.Cod_Dep;
                    cmd.Parameters.Add(new MySqlParameter("@ev_financeiro", MySqlDbType.Int32)).Value = eventoF;
                    cmd.Parameters.Add(new MySqlParameter("@quantidade", MySqlDbType.Int32)).Value = 1;
                    cmd.Parameters.Add(new MySqlParameter("@valor_unitario", MySqlDbType.Double)).Value = Convert.ToDouble(cash);
                    cmd.Parameters.Add(new MySqlParameter("@valor_total", MySqlDbType.Double)).Value = Convert.ToDouble(cash);
                    cmd.Parameters.Add(new MySqlParameter("@dt_lancamento", MySqlDbType.Date)).Value = Convert.ToDateTime(dt_lancamento); //  X
                    cmd.Parameters.Add(new MySqlParameter("@dt_vencimento", MySqlDbType.Date)).Value = ent; // X
                    cmd.Parameters.Add(new MySqlParameter("@dt_pagamento", MySqlDbType.Date)).Value = saida; //  X
                    cmd.Parameters.Add(new MySqlParameter("@dt_insercao", MySqlDbType.DateTime)).Value = saida; //  X
                    cmd.Parameters.Add(new MySqlParameter("@dt_insercao_pagamento", MySqlDbType.DateTime)).Value = insercao_pagto; // X
                    cmd.Parameters.Add(new MySqlParameter("@referencia", MySqlDbType.Date)).Value = referencia;
                    cmd.Parameters.Add(new MySqlParameter("@cobrador_lancto", MySqlDbType.VarChar)).Value = cobrador;
                    cmd.Parameters.Add(new MySqlParameter("@cobrador_pagto", MySqlDbType.VarChar)).Value = cobrador;
                    cmd.Parameters.Add(new MySqlParameter("@usr_lancto", MySqlDbType.VarChar)).Value = usre;
                    cmd.Parameters.Add(new MySqlParameter("@forma_pagto", MySqlDbType.Int32)).Value = 1;
                    cmd.ExecuteNonQuery();

                    #endregion

                    #region TratamentoUpdate

                    cmd.CommandText = Update;
                    cmd.Parameters.Add(new MySqlParameter("@dt_saida", MySqlDbType.DateTime)).Value = conv.Dt_Saida;
                    cmd.Parameters.Add(new MySqlParameter("@usr_saida", MySqlDbType.VarChar)).Value = usuario;
                    cmd.Parameters.Add(new MySqlParameter("@status", MySqlDbType.VarChar)).Value = status;
                    cmd.Parameters.Add(new MySqlParameter("@deb", MySqlDbType.Int32)).Value = deb;
                    cmd.Parameters.Add(new MySqlParameter("@nome", MySqlDbType.VarChar)).Value = retorno.Nome;
                    cmd.ExecuteNonQuery();

                    #endregion

                    ta.Commit();

                }
            }
        }

Cmd.Parameter.Clear()良い習慣ではありません。これが答えです。

ForEachLoop の外側:

Cmd.Parameter.Add(new MySqlParameter("@Hellow", MySqlDataType));

ForEachLoop の内部

Cmd.Parameter["@Hellow"].Value = anyValueOrVariable;
4

2 に答える 2

11

ループ内で同じパラメーターをコマンドに何度も追加しています。例外はあなたに問題を伝えています。

パラメータをループ外に保存して値をリセットするか、ループを通過するたびにパラメータをクリアします。

最も速い解決策は、次のようなものです。

  #region TratamentoInsert
                    cmd.Parameters.Clear();//<--clear all the parameters.
                    cmd.CommandText = Insert;

それがパラメーター コレクションをクリアするための正確なコードであるかどうかはわかりませんが、フライトに遅れて確認できません。みたいなもんでしょう。

于 2012-10-19T14:18:57.780 に答える
3

cmdすべてのループにパラメーターを追加しています。初期化するのと同じ時点でパラメータを作成するcmdか、再度追加する前にパラメータをクリアしてください。

于 2012-10-19T14:18:10.073 に答える