none
TimerJob обновляет только 1 строчку RRS feed

  • Вопрос

  • Доброй ночи.

    Пишу TimerJob, который проверяет статус в таблице Oracle, если он равен 1, то меняет на листе sharepoint статус колонки у всех элементов, ID которые совпадают с ID в таблице Oracle (у которых статус 1).

    Проблема в том, что TimerJob обновляет только 1 элемент и 1 строку в базе, хотя данных много, при повторном запуске обновляет другую строчку, тоже только 1, как будто только 1 итерацию выполняет. C# я для себя открыл всего дня 2 назад, поэтому может быть страшный говнокод, но прошу строго не ругать, я только учусь и хочу понять, в чем мой косяк. Столько форумов просмотрел и на msdn столько мануалок прочитал, ну никак не могу понять, в чем косяк. Заранее благодарен всем за помощь!

    private void CopyItems(SPList list)
            {
                string ConStr = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=IP)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=NAME)));User Id=user;Password=pass;";
                
                using (OracleConnection con = new OracleConnection(ConStr))
    
                using (OracleCommand cmd = new OracleCommand("select ID_Sharepoint from testtable where statusbank = 1 AND statustimerjob = 0", con))
                {
                    con.Open();
    
                    foreach (SPListItem item in list.Items)
                    {
                        if ((bool)item["Оплачено"] == false && (bool)item["Выгружено"] == true && Convert.ToInt32(item["Процесс согласования служебной записки"]) == 19)
                        {
                            using (OracleDataReader reader = cmd.ExecuteReader())
                            {
                                using (OracleTransaction txn = con.BeginTransaction(IsolationLevel.ReadCommitted))
                                {
                                    while (reader.Read())
                                    {
                                        decimal ID = reader.GetDecimal(0);
                                            if (item["ID"].ToString() == ID.ToString())
                                            {
                                                item["Оплачено"] = true;
                                                item.Update();
                                                cmd.CommandText = "update testable set STATUSTIMERJOB = 1 where ID_SHAREPOINT= :ID";
                                                cmd.Parameters.Add(":ID", ID);
                                                cmd.Parameters[":ID"].Value = ID;
                                                cmd.CommandType = CommandType.Text;
                                                cmd.ExecuteNonQuery();
                                                txn.Commit();
                                                                                           
                                            }
                                    }
                                }                         
                            }
                        }
                    } con.Close();
                }   
            }


    • Изменено mardoksp 30 июля 2013 г. 21:44 s
    30 июля 2013 г. 21:42

Ответы

  • вопрос решился, кому интересно, вот пример правки куска кода

    foreach (SPListItem item in list.Items)
                    {
                        if ((bool)item["Оплачено"] == false && (bool)item["Выгружено"] == true && Convert.ToInt32(item["Процесс согласования служебной записки"]) == 19)
                        {
                            using (OracleDataReader reader = cmd.ExecuteReader())
                            {
                                using (TransactionScope scope = new TransactionScope())
                                {
                                    while (reader.Read())
                                    {
                                        decimal ID = reader.GetDecimal(0);
                                            if (item["ID"].ToString() == ID.ToString())
                                            {
                                                using (OracleConnection con2 = new OracleConnection(ConStr))
                                                {
                                                    con2.Open();
                                                    OracleCommand cmd2 = new OracleCommand("update web.orders2pay set STATUSTIMERJOB = 1 where ID_SHAREPOINT= :ID", con2);
                                                    cmd2.Parameters.Add(":ID", ID);
                                                    cmd2.Parameters[":ID"].Value = ID;
                                                    cmd2.ExecuteNonQuery();
    
                                                    item["Оплачено"] = true;
                                                    item.Update();
                                                }
                                                                                           
                                            }
                                    } scope.Complete();
                                }                         
                            }
                        }
                    } con.Close();

    31 июля 2013 г. 5:57

Все ответы

  • вопрос решился, кому интересно, вот пример правки куска кода

    foreach (SPListItem item in list.Items)
                    {
                        if ((bool)item["Оплачено"] == false && (bool)item["Выгружено"] == true && Convert.ToInt32(item["Процесс согласования служебной записки"]) == 19)
                        {
                            using (OracleDataReader reader = cmd.ExecuteReader())
                            {
                                using (TransactionScope scope = new TransactionScope())
                                {
                                    while (reader.Read())
                                    {
                                        decimal ID = reader.GetDecimal(0);
                                            if (item["ID"].ToString() == ID.ToString())
                                            {
                                                using (OracleConnection con2 = new OracleConnection(ConStr))
                                                {
                                                    con2.Open();
                                                    OracleCommand cmd2 = new OracleCommand("update web.orders2pay set STATUSTIMERJOB = 1 where ID_SHAREPOINT= :ID", con2);
                                                    cmd2.Parameters.Add(":ID", ID);
                                                    cmd2.Parameters[":ID"].Value = ID;
                                                    cmd2.ExecuteNonQuery();
    
                                                    item["Оплачено"] = true;
                                                    item.Update();
                                                }
                                                                                           
                                            }
                                    } scope.Complete();
                                }                         
                            }
                        }
                    } con.Close();

    31 июля 2013 г. 5:57
  • Спасибо за то, что Вы представили решение проблемы, потому что оно может быть полезным и для других пользователей!


    Уважаемые участники форума. У меня к Вам просьба: если какой-нибудь из ответов помог Вам решить Вашу проблему, пожалуйста, не забывайте отмечать его. Таким образом, Вы поможете и другим пользователям, у которых возникла схожая проблема! Спасибо!

    31 июля 2013 г. 6:33
    Модератор