Hardevsinh Mori Ответов: 2

Как ссылаться на объект и передавать его методу в C#?


Вот мой код:
private void btnsend_Click(object sender, EventArgs e)
       {
           cn.Open();//Conncetion

           try
           {
               var size = textBox3.Text;
               var machine = comboBox1.SelectedItem.ToString();
               MySqlCommand cmd = new MySqlCommand("select kgs from capacity_master where(nsize=@size and mname=@machine)", cn);
               cmd.Parameters.AddWithValue("@size", size);
               cmd.Parameters.AddWithValue("@machine", machine);
               using (MySqlDataReader sf = cmd.ExecuteReader())
               {
                   while (sf.Read())
                   {
                       oload = double.Parse(sf[0].ToString());
                   }
               }
           }
           catch (Exception eli)
           {
               MessageBox.Show("" + eli);
           }

           MySqlTransaction el = cn.BeginTransaction();//Transaction Started From Here

           try
           {
               string fvno;
               dateTimePicker1.Value = DateTime.Now;
               dateTimePicker2.Value = DateTime.Now;
               var tdat = dateTimePicker2.Value;
               var ttime = dateTimePicker1.Value;
               fvno = textBox1.Text;

               MySqlCommand genvoucher = new MySqlCommand("insert into htemp(vno,bno,nsize,machine,loadqty,overload,vdate,operator,stime,shift,status) values(@vno,@bno,@size,@machine,@load,@oload,@date,@opt,@start,@shift,@status)", cn,el);
               genvoucher.Parameters.AddWithValue("@vno", fvno);
               genvoucher.Parameters.AddWithValue("@size", textBox3.Text);
               genvoucher.Parameters.AddWithValue("@bno", comboBox3.SelectedItem.ToString());
               genvoucher.Parameters.AddWithValue("@machine", comboBox1.SelectedItem.ToString());
               genvoucher.Parameters.AddWithValue("@load", textBox14.Text);

               var canload = oload;
               var doload = double.Parse(textBox14.Text);
               string ans;
               if (doload > canload)
               {
                   ans = "Yes";
               }
               else
               {
                   ans = "No";
               }
               genvoucher.Parameters.AddWithValue("@oload", ans);

               genvoucher.Parameters.AddWithValue("@date", tdat);
               genvoucher.Parameters.AddWithValue("@opt", comboBox4.SelectedItem.ToString());
               genvoucher.Parameters.AddWithValue("@shift", shift);
               genvoucher.Parameters.AddWithValue("@start", ttime);
               genvoucher.Parameters.AddWithValue("@status", "Open");
               genvoucher.ExecuteNonQuery();

               MySqlCommand df = new MySqlCommand("insert into vouchers values(@vno,@dept,@shift,@task,@stats,@remarkn,@remarkv)", cn,el);
               df.Parameters.AddWithValue("@vno", textBox1.Text);
               df.Parameters.AddWithValue("@dept", dept);
               df.Parameters.AddWithValue("@shift", shift);
               df.Parameters.AddWithValue("@task", "HTemp");
               df.Parameters.AddWithValue("@stats", "Open");
               df.Parameters.AddWithValue("@remarkn", "");
               df.Parameters.AddWithValue("@remarkv", "");
               df.ExecuteNonQuery();

               // Method To Do Other SQL Transaction
                  batchprocess2();

               MessageBox.Show("Voucher Opened Successfully!");
               el.Commit();//Transaction Committed Here
               this.Close();
           }
           catch (Exception eli)
           {
               MessageBox.Show("Can't Generate Voucher" + Environment.NewLine + eli);
               try
               {
                   el.Rollback();//Rollbacked if Exception any
               }
               catch(Exception ea)
               {
                   MessageBox.Show("Rollback Exception"+ea.Message);
               }
           }
           cn.Close();
       }

       public void batchprocess2()
       {
           try
           {
               var lqty = float.Parse(textBox14.Text);
               var ti = float.Parse(textBox31.Text);
               var tw = float.Parse(textBox29.Text);
               var fti = ti - lqty;
               var ftw = tw + lqty;
               MySqlCommand opp = new MySqlCommand("update batch_process set tem_in=@ti,tem_wait=@tw where batch_no=@nbno", cn);
               opp.Parameters.AddWithValue("@nbno", comboBox3.SelectedItem.ToString());
               opp.Parameters.AddWithValue("@ti", fti);
               opp.Parameters.AddWithValue("@tw", ftw);
               opp.ExecuteNonQuery();
           }
           catch (Exception eli)
           {
               MessageBox.Show("Can't update batch" + eli);
           }
       }


Когда возникает исключение, транзакция откатывается от того места, где она была начата, к тому месту, где она была зафиксирована.
Но я создал один метод между этой транзакцией, и я хочу включить этот метод транзакции в основную транзакцию.

я хочу откатить и зафиксировать все транзакции между
BeginTransaction()
и
Commit()

Но я не могу перефразировать объект MySqlTransaction, как я могу это сделать?

Что я уже пробовал:

Просто я пытаюсь использовать объект MysqlTransaction путем рефренса в свой метод с именем "batchprocess2".
Я хочу включить все запросы в основную транзакцию.

Как это возможно или нет?

2 Ответов

Рейтинг:
15

OriginalGriff

Вам не нужно передавать объект транзакции вашему методу, если вы не ожидаете, что этот метод зафиксирует или откатит транзакцию - и это было бы плохой идеей, потому что метод ничего не знает о том, что происходит за его пределами.

Вместо того чтобы передавать транзакцию, в вашем блоке catch бросьте новое исключение, которое включает в себя eli исключение как InnerException и пусть ваш нормальный try...catch блок во внешнем методе обрабатывает его и откатывает транзакцию:

catch (Exception eli)
{
    throw new ApplicationException("Can't update Batch", eli);
}


[no name]

я просто хочу, чтобы если внутренняя транзакция btnsend не удалась в любом случае, мне нужно откатить откат всех транзакций, связанных с этой транзакцией, а также транзакцию метода batchprocess2.

Он применим для всех, если исключение возникает во время транзакции при любом запросе необходимости отката.

OriginalGriff

Да-вот почему вы создаете новое исключение, содержащее оригинал как внутреннее исключение. Оригинальный метод, чем ловит это через свой блок try ... catch и откатывается туда.

[no name]

Поэтому мне нужно бросить внутреннее исключение во внешний блок catch метода.
Хорошо, сэр, я понимаю Вас за то, что вы даете правильные советы.

OriginalGriff

Пожалуйста!

Рейтинг:
1

Graeme_Grant

Насколько я понимаю, вы можете иметь штабеля SQLTransaction[^] однако если внешние SqlTransactions откатываются, то же самое происходит и с внутренними. Поэтому, если вы хотите, чтобы изменения БД не были затронуты откатом SqlTransaction, то эти действия должны существовать снаружи, иначе они также будут откатаны.


[no name]

нет, я хочу, чтобы отката за пределами сделки, но также я создаю только одну сделку из открытой связи, чтобы закрыть и batchprocess2 метод включен между ними

Graeme_Grant

Не я устанавливаю правила. Это то, что есть.