Как правильно использовать соединения и транзакции в цикле FOR? - PullRequest
0 голосов
/ 01 июня 2019

РЕДАКТИРОВАТЬ: я получаю ОШИБКУ, что мое соединение уже закрыто

Я только начал работать с некоторыми базами данных и соединениями. Я не совсем понял, как они работали, и написал абсолютное чудовище. Если кто-нибудь сможет исправить этот код, я буду очень благодарен, так как я понятия не имею, что делать. Благодарю. PS. Переменные показывают, насколько я близок к тому, чтобы сойти с ума PPS. Я пытался сделать код более приятным, но переполнение стека просто не позволит мне

        povezava = new SqlConnection(izdvor);


        povezava.Open();

        SqlTransaction mTrans = povezava.BeginTransaction();
        poizvedba = new SqlCommand("SELECT COUNT(id) FROM Tekme", povezava);
        poizvedba.Transaction = mTrans;
        int Tekma = (int)poizvedba.ExecuteScalar();


            poizvedba.CommandType = CommandType.Text;
        poizvedba.ExecuteNonQuery();
        mTrans.Commit();
        povezava.Close();
        for (int i = 0; i < Tekma; i++)
        {
            if (i < Tekma)
            {
                string dab1 = @"Data Source=dd\sqlexpress;Initial catalog=Grubelnik2_3DR;user ID=arduino;Password=arduino";
                lol1 = new SqlConnection(dab1);


                povezava.Open();

                SqlTransaction fTrans = lol1.BeginTransaction();
                test1 = new SqlCommand("SELECT Datum FROM Tekme WHERE id = " + i + "", lol1);
                test1.Transaction = mTrans;
                string Datum = test1.ExecuteScalar().ToString();
                string Datum1 = DateTime.Now.ToString("M/d/yyyy");
                int a = i;


                test1.CommandType = CommandType.Text;
                test1.ExecuteNonQuery();
                fTrans.Commit();
                lol1.Close();
                if (DateTime.Parse(Datum) <= DateTime.Parse(Datum1))
                {
                    string dab2 = @"Data Source=dd\sqlexpress;Initial catalog=Grubelnik2_3DR;user ID=arduino;Password=arduino";
                    lol2 = new SqlConnection(dab2);
                    povezava.Open();

                    SqlTransaction kTrans = lol2.BeginTransaction();
                    test2 = new SqlCommand("SELECT Ura FROM Tekme WHERE id = " + i + "", lol2);
                    test2.Transaction = mTrans;
                    int Ura = (int)test2.ExecuteScalar();

                    DateTime dt = DateTime.Now;
                    int hour = dt.Hour;



                    test2.CommandType = CommandType.Text;
                    test2.ExecuteNonQuery();
                    kTrans.Commit();
                    lol2.Close();
                    if (Ura < hour)
                    {
                        string dab3 = @"Data Source=dd\sqlexpress;Initial catalog=Grubelnik2_3DR;user ID=arduino;Password=arduino";
                        lol3 = new SqlConnection(dab3);
                        povezava.Open();

                        SqlTransaction yTrans = lol3.BeginTransaction();
                        test3 = new SqlCommand("SELECT Minuta FROM Tekme WHERE id = " + i + "", lol3);
                        test3.Transaction = mTrans;
                        int Minuta = (int)test3.ExecuteScalar();

                        DateTime ft = DateTime.Now;
                        int minute = ft.Minute;



                        test3.CommandType = CommandType.Text;
                        test3.ExecuteNonQuery();
                        yTrans.Commit();
                        lol3.Close();
                        if (Minuta < minute)
                        {
                            string dab4 = @"Data Source=dd\sqlexpress;Initial catalog=Grubelnik2_3DR;user ID=arduino;Password=arduino";
                            lol4 = new SqlConnection(dab4);
                            povezava.Open();

                            SqlTransaction xTrans = povezava.BeginTransaction();
                            test4 = new SqlCommand("UPDATE Uporabniki SET idPaketa = @Kdaj WHERE id = " + i + "", povezava);
                            test4.Transaction = mTrans;
                            test4.Parameters.Add(new SqlParameter("@Kdaj", "Prihodnost"));


                            test4.CommandType = CommandType.Text;
                            test4.ExecuteNonQuery();
                            xTrans.Commit();
                            lol4.Close();
                            a = 0;
                        }

1 Ответ

1 голос
/ 01 июня 2019

Насколько я могу судить, вы продолжаете открывать соединение povenza с povezava.Open();, если считаете, что на самом деле имеете в виду:

...
lol1.Open()
...
lol2.Open()
...
lol3.Open()
...
lol4.Open()
...

Поскольку вы начинаете транзакции, фактически не открывая соединения.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...