コード例 #1
0
        //private enum ResType { NOTHING, NYA, DISQ, RES }

        public bool SaveRes(DataTable dt, SqlTransaction tr)
        {
            if (dt == null || dt.Rows.Count < 1)
            {
                return(true);
            }
            int iidCol = dt.Columns.IndexOf(ResNUM),
                nyaCol = dt.Columns.IndexOf(NYA), dsqCol = dt.Columns.IndexOf(DSQ),
                clmNumCol = dt.Columns.IndexOf(ClmNUM);

            if (iidCol < 0)
            {
                throw new ArgumentException("Неверная струткура таблицы. Столбец ResIid не найден.");
            }
            if (nyaCol < 0)
            {
                throw new ArgumentException("Неверная струткура таблицы. Столбец " + NYA + " не найден.");
            }
            if (dsqCol < 0)
            {
                throw new ArgumentException("Неверная струткура таблицы. Столбец " + DSQ + " не найден.");
            }
            if (clmNumCol < 0)
            {
                throw new ArgumentException("Неверная струткура таблицы. Столбец с номером участника не найден.");
            }
            int[] topCol = new int[routeNumber], bonusCol = new int[routeNumber];
            for (int i = 1; i <= routeNumber; i++)
            {
                topCol[i - 1]   = dt.Columns.IndexOf("T" + i.ToString());
                bonusCol[i - 1] = dt.Columns.IndexOf("B" + i.ToString());
                if (topCol[i - 1] < 0 || bonusCol[i - 1] < 0)
                {
                    throw new ArgumentException("Неверная структура таблицы. Данные по трассе " + i.ToString() + " не найдены");
                }
            }

            if (cn.State != ConnectionState.Open)
            {
                cn.Open();
            }
            SqlTransaction tran;

            if (tr == null)
            {
                tran = cn.BeginTransaction();
            }
            else
            {
                tran = tr;
            }
            var        internationalRules = (SettingsForm.GetSpeedRules(cn, tran) & SpeedRules.InternationalRules) == SpeedRules.InternationalRules;
            bool       transactionSuccess = false;
            SqlCommand cmd = new SqlCommand();

            cmd.Connection  = cn;
            cmd.Transaction = tran;
            cmd.Parameters.Add("@iid", SqlDbType.BigInt);
            cmd.Parameters[0].Value = 0;
            cmd.Parameters.Add("@nya", SqlDbType.Bit);
            cmd.Parameters[1].Value = false;
            cmd.Parameters.Add("@dsq", SqlDbType.Bit);
            cmd.Parameters[2].Value = false;
            cmd.Parameters.Add("@t", SqlDbType.Int);
            cmd.Parameters.Add("@ta", SqlDbType.Int);
            cmd.Parameters.Add("@b", SqlDbType.Int);
            cmd.Parameters.Add("@ba", SqlDbType.Int);
            cmd.Parameters.Add("@res", SqlDbType.BigInt);
            for (int i = 3; i < cmd.Parameters.Count; i++)
            {
                cmd.Parameters[i].Value = 0;
            }
            string cmdDel    = "DELETE FROM BoulderRoutes WHERE iid_parent = @iid";
            string cmdUpdate = "UPDATE boulderResults SET nya=@nya, disq=@dsq, changed = 1," +
                               "tops = @t, topAttempts = @ta, bonuses = @b, bonusAttempts = @ba,res = @res WHERE iid=@iid";

            try
            {
                foreach (DataRow dr in dt.Rows)
                {
                    if (dr[iidCol] == DBNull.Value)
                    {
                        continue;
                    }
                    //ResType r;
                    bool nya = (dr[nyaCol] == DBNull.Value ? false : Convert.ToBoolean(dr[nyaCol]));
                    bool dsq = (dr[dsqCol] == DBNull.Value ? false : Convert.ToBoolean(dr[dsqCol]));
                    long id  = Convert.ToInt64(dr[iidCol]);
                    cmd.Parameters[0].Value = id;
                    long t = 0, tA = 0, b = 0, bA = 0;
                    int? top, bonus;
                    if (nya)
                    {
                        cmd.CommandText = cmdDel;
                        cmd.ExecuteNonQuery();
                        //r = ResType.NYA;
                        cmd.Parameters[1].Value = true;
                        cmd.Parameters[2].Value = false;
                        cmd.Parameters[7].Value = NYARES;
                    }
                    else if (dsq)
                    {
                        cmd.CommandText = cmdDel;
                        cmd.ExecuteNonQuery();
                        //r = ResType.DISQ;
                        cmd.Parameters[1].Value = false;
                        cmd.Parameters[2].Value = true;
                        cmd.Parameters[7].Value = DSQRES;
                    }
                    else
                    {
                        cmd.Parameters[1].Value = cmd.Parameters[2].Value = false;
                        bool hasClimbed = false;
                        //r = ResType.RES;
                        for (int i = 0; i < topCol.Length; i++)
                        {
                            top   = (dr[topCol[i]] == DBNull.Value ? null : (int?)Convert.ToInt32(dr[topCol[i]]));
                            bonus = (dr[bonusCol[i]] == DBNull.Value ? null : (int?)Convert.ToInt32(dr[bonusCol[i]]));
                            if (top != null && top > 0)
                            {
                                if (bonus == null)
                                {
                                    throw new ArgumentNullException("Бонус у участника №" + dr[ClmNUM].ToString() + " не введён.");
                                }
                                else if (bonus > top)
                                {
                                    throw new ArgumentOutOfRangeException("Бонус у участника №" + dr[ClmNUM].ToString() + " больше ТОПа.");
                                }
                            }
                            else if (top == null && bonus != null)
                            {
                                top = 0;
                            }
                            if (!hasClimbed && top != null && bonus != null)
                            {
                                hasClimbed = true;
                            }
                            t  += (top != null && top > 0 ? 1 : 0);
                            tA += (top != null && top > 0 ? (int)top : 0);
                            b  += (bonus != null && bonus > 0 ? 1 : 0);
                            bA += (bonus != null && bonus > 0 ? (int)bonus : 0);
                            SaveRes(i + 1, top, bonus, id, tran);
                        }
                        if (hasClimbed)
                        {
                            var res = internationalRules
                                ? t * 100000000000 + b * 1000000000 + (MAXAT - tA) * 100000 + (MAXAT - bA) * 10 + SIMPLERES
                                : t * 100000000000 + (MAXAT - tA) * 10000000 + b * 100000 + (MAXAT - bA) * 10 + SIMPLERES;
                            cmd.Parameters[7].Value = res;
                        }
                        else
                        {
                            cmd.Parameters[7].Value = DBNull.Value;
                        }
                    }
                    cmd.Parameters[3].Value = t;
                    cmd.Parameters[4].Value = tA;
                    cmd.Parameters[5].Value = b;
                    cmd.Parameters[6].Value = bA;

                    cmd.CommandText = cmdUpdate;
                    cmd.ExecuteNonQuery();
                }
                transactionSuccess = true;
            }
            finally
            {
                if (tr == null)
                {
                    if (transactionSuccess)
                    {
                        tran.Commit();
                    }
                    else
                    {
                        tran.Rollback();
                    }
                }
            }
            return(true);
        }
コード例 #2
0
        private ApiListHeader GetListHeader(int iid)
        {
            using (var cmd = this.CreateCommand())
            {
                cmd.CommandText = "select G." + ServiceHelper.REMOTE_ID_COLUMN + " group_id, L.listType, L.style, L.round, isnull(L.quote,0) quote," +
                                  "       L.allowView, isnull(LP." + ServiceHelper.REMOTE_ID_COLUMN + ", '') prevRoundId, isnull(L.routeNumber,0) routeNumber," +
                                  "       isnull(PR." + ServiceHelper.REMOTE_ID_COLUMN + ", '') parentIid," +
                                  "       IsNull(L." + ServiceHelper.REMOTE_ID_COLUMN + ", '') " + ServiceHelper.REMOTE_ID_COLUMN +
                                  "  from Lists L(nolock)" +
                                  " left join Lists LP(nolock) on LP.iid = L.prev_round" +
                                  " left join Lists PR(nolock) on PR.iid = L.iid_parent" +
                                  "      join Groups G(nolock) on G.iid = L.group_id" +
                                  "     where L.iid = @iid";
                cmd.Parameters.Add("@iid", SqlDbType.Int).Value = iid;

                bool iRulesLead = SettingsForm.GetLeaveTrains(this.cn, this.currentTransaction);
                var  sr         = SettingsForm.GetSpeedRules(this.cn, this.currentTransaction);

                using (var rdr = cmd.ExecuteReader())
                {
                    if (!rdr.Read())
                    {
                        return(null);
                    }
                    int routeNumber;
                    var round = ClimbingRoundExtensions.GetByLocalizedValue(rdr["round"].ToString(), out routeNumber, DefaultUICulture);
                    if (routeNumber < 1)
                    {
                        routeNumber = Convert.ToInt32(rdr["routeNumber"]);
                    }

                    ListType listType;
                    try { listType = (ListType)Enum.Parse(typeof(ListType), rdr["listType"].ToString(), true); }
                    catch { listType = ListType.Unknown; }

                    Rules r;
                    var   style = Extensions.StringExtensions.GetEnumByStringValue <ClimbingStyles>(rdr["style"].ToString(), ClimbingStyles.Lead, DefaultUICulture);
                    if (style == ClimbingStyles.Speed)
                    {
                        r = (sr & SpeedRules.InternationalSchema) == SpeedRules.InternationalSchema ? Rules.International : Rules.Russian;
                        if ((sr & SpeedRules.BestResultFromTwoQfRounds) == SpeedRules.BestResultFromTwoQfRounds)
                        {
                            r = r | Rules.BestRouteInQf;
                        }
                    }
                    else
                    {
                        r = iRulesLead ? Rules.International : Rules.Russian;
                    }
                    return(new ApiListHeader
                    {
                        AgeGroupInCompId = rdr["group_id"].ToString(),
                        ClimbingRules = r,
                        IidParent = rdr["parentIid"].ToString(),
                        ListTypeV = listType,
                        Live = Convert.ToInt32(rdr["allowView"]) > 0,
                        PreviousRoundId = rdr["prevRoundId"].ToString(),
                        Quota = Convert.ToInt32(rdr["quote"]),
                        Round = round,
                        RouteNumber = routeNumber,
                        Style = style,
                        Iid = rdr[ServiceHelper.REMOTE_ID_COLUMN].ToString(),
                        SecretaryId = iid
                    });
                }
            }
        }