コード例 #1
0
        public static void DeleteSlotRange(int id, SlotRange range)
        {
            string errMsg = "";

            try
            {
                SqlConnection db = new SqlConnection(connectionString);
                SqlTransaction transaction;

                db.Open();

                transaction = db.BeginTransaction(IsolationLevel.RepeatableRead);
                try
                {
                    byte[] timestamp = range.getByteTimestamp();

                    SqlCommand cmd = new SqlCommand("SELECT * " +
                                                    "FROM SlotRange S " +
                                                    "WHERE S.id_slotRange=@id AND S.timestamp=@timestamp;", db, transaction);

                    cmd.Parameters.Add("@id", SqlDbType.Int).Value = id;
                    cmd.Parameters.Add("@timestamp", SqlDbType.Binary).Value = timestamp;

                    SqlDataReader rdr = cmd.ExecuteReader();

                    if (rdr.Read())
                    {
                        rdr.Close();

                        cmd = new SqlCommand("DELETE FROM Slot WHERE id_slotRange=@id;", db, transaction);
                        cmd.Parameters.Add("@id", SqlDbType.Int).Value = id;
                        cmd.ExecuteNonQuery();

                        cmd = new SqlCommand("DELETE FROM MachineSlotRange WHERE id_slotRange=@id;", db, transaction);
                        cmd.Parameters.Add("@id", SqlDbType.Int).Value = id;
                        cmd.ExecuteNonQuery();

                        cmd = new SqlCommand("DELETE FROM SlotRange WHERE id_slotRange=@id;", db, transaction);
                        cmd.Parameters.Add("@id", SqlDbType.Int).Value = id;
                        cmd.ExecuteNonQuery();
                    }
                    else
                    {
                        rdr.Close();
                        errMsg += " " + Messages.recommencerDelete;
                        Console.WriteLine("Cross modify");
                        throw new GrException(Messages.recommencerDelete);
                    }

                    transaction.Commit();
                }
                catch (SqlException sqlError)
                {
                    Console.WriteLine(sqlError);
                    transaction.Rollback();
                    throw new GrException(sqlError, Messages.errProd);
                }
                db.Close();
            }
            catch (Exception ex)
            {
                if (ex is GrException) throw ex;
                throw new GrException(ex, Messages.errProd);
            }
        }
コード例 #2
0
        public static void UpdateSlotRange(SlotRange range)
        {
            try
            {
                SqlConnection db = new SqlConnection(connectionString);
                SqlTransaction transaction;

                db.Open();

                transaction = db.BeginTransaction(IsolationLevel.RepeatableRead);
                try
                {
                    byte[] timestamp = range.getByteTimestamp();

                    SqlCommand cmd = new SqlCommand("SELECT * FROM SlotRange R " +
                        "WHERE R.[id_slotRange]=@id AND R.timestamp=@timestamp;", db, transaction);

                    cmd.Parameters.Add("@id", SqlDbType.Int).Value = range.id_slotRange;
                    cmd.Parameters.Add("@timestamp", SqlDbType.Binary).Value = timestamp;

                    SqlDataReader rdr = cmd.ExecuteReader();

                    if (rdr.Read())
                    {
                        rdr.Close();

                        cmd = new SqlCommand("SELECT CASE  WHEN DATEDIFF(d, startRes, GETDATE ())  >= 0 AND DATEDIFF(d, GETDATE(), endRes) >= 0 THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END locked " +
                     "FROM SlotRange where id_slotRange=@id;", db, transaction);
                        cmd.Parameters.Add("@id", SqlDbType.Int).Value = range.id_slotRange;
                        rdr = cmd.ExecuteReader();
                        Boolean isLocked = false;
                        if (rdr.Read())
                        {
                            isLocked = rdr.GetBoolean(rdr.GetOrdinal("locked")); ;
                        }
                        rdr.Close();

                        cmd = new SqlCommand("UPDATE SlotRange SET startRes=@startRes, endRes=@endRes, " +
                            "name=@name, id_course=@idCourse WHERE id_slotRange=@id;", db, transaction);
                        cmd.Parameters.Add("@startRes", SqlDbType.DateTime).Value = range.StartRes;
                        cmd.Parameters.Add("@endRes", SqlDbType.DateTime).Value = range.EndRes;
                        cmd.Parameters.Add("@name", SqlDbType.Char).Value = range.Name;
                        cmd.Parameters.Add("@idCourse", SqlDbType.Int).Value = range.IdCourse;
                        cmd.Parameters.Add("@id", SqlDbType.Int).Value = range.id_slotRange;
                        cmd.ExecuteNonQuery();

                        if (!isLocked)
                        {
                            SqlCommand cmd2 = new SqlCommand("DELETE FROM Slot WHERE id_slotRange=@id;", db, transaction);
                            cmd2.Parameters.Add("@id", SqlDbType.Int).Value = range.id_slotRange;
                            cmd2.ExecuteNonQuery();

                            //do slots
                            InsertAllSlots(range, range.id_slotRange, db, transaction);
                        }

                        //do machines
                        //we update only as long as we keep at least as many machines as there already are in the database for this slotrange

                        SqlCommand cmd3 = new SqlCommand("SELECT COUNT(id_slotRange) as cpt " +
                            "FROM [GR-Calcul].[dbo].[MachineSlotRange] WHERE id_slotRange=@id;", db, transaction);
                        cmd3.Parameters.Add("@id", SqlDbType.Int).Value = range.id_slotRange;

                        SqlDataReader rdr2 = cmd3.ExecuteReader();
                        int nMachines = 0;
                        if (rdr2.Read())
                        {
                            nMachines = rdr2.GetInt32(rdr2.GetOrdinal("cpt"));
                        }
                        rdr2.Close();
                        if (range.Machines.Count >= nMachines)
                        {
                            SqlCommand cmd4 = new SqlCommand("DELETE FROM MachineSlotRange WHERE id_slotRange=@id;", db, transaction);
                            cmd4.Parameters.Add("@id", SqlDbType.Int).Value = range.id_slotRange;
                            cmd4.ExecuteNonQuery();
                            foreach (var machine in range.Machines)
                            {
                                InsertMachines(machine, range.id_slotRange, db, transaction);
                            }
                        }
                        transaction.Commit();
                    }
                    else
                    {
                        rdr.Close();
                        Console.WriteLine("Cross modify");
                        throw new GrException(Messages.recommencerEdit);
                    }
                }
                catch (Exception ex)
                {
                    transaction.Rollback();
                    System.Diagnostics.Debug.WriteLine(ex.Message);
                    System.Diagnostics.Debug.WriteLine(ex.StackTrace);
                    throw new GrException(ex, Messages.errProd);
                }
                finally
                {
                    db.Close();
                }
            }
            catch (Exception ex)
            {
                if (ex is GrException) throw ex;
                throw new GrException(ex, Messages.errProd);
            }
        }