如何在FOR循环中正确使用连接和事务?

时间:2019-06-01 16:20:42

标签: c# transactions

编辑:我收到我的连接已经关闭的错误

我刚刚开始使用一些数据库和连接。我不完全了解他们是如何工作的,并写出了绝对的怪物。如果有人能解决此代码,我将不胜感激,因为我不知道该怎么办。谢谢。 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 个答案:

答案 0 :(得分:1)

据我所知,当您相信自己的意思时,您会继续打开与povenza的{​​{1}}连接:

povezava.Open();

因为您是在没有实际打开连接的情况下开始事务的。

此外,通常也不建议在一个循环中打开和关闭数据库连接,因为这会很快失去控制并影响数据库性能。最好事先合并或事后处理,并在可能的情况下执行单个操作。