//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); }
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 }); } } }