Example #1
0
        protected void ReadDataTable(ReplicationService.DataTable Table, IDataReader rdr)
        {
            Table.Columns = new List <ReplicationService.DataColumn>();
            int col = rdr.FieldCount;

            // начинаем с третьей позиции
            // 0=TableName, 1-ItemId, 2-ItemGen
            for (int i = 3; i < col; i++)
            {
                var c = new ReplicationService.DataColumn();
                c.Name     = rdr.GetName(i);
                c.DataType = (ReplicationService.SqlDbType)SqlExtension.GetSqlDbType(rdr.GetDataTypeName(i));
                Table.Columns.Add(c);
            }
        }
 Boolean ProcessItem(Int64 itemId, String itemName)
 {
     if (!_counters.ContainsKey(itemName))
     {
         _counters.Add(itemName, 0);
     }
     ReplicationService.PackageData pd = new ReplicationService.PackageData();
     using (var cmd = _cnn.CreateCommand())
     {
         cmd.CommandType = CommandType.StoredProcedure;
         cmd.CommandText = String.Format("a2repl.get_{0}_for_send", itemName);
         cmd.Parameters.AddWithValue("@id", itemId);
         using (var rdr = cmd.ExecuteReader())
         {
             do
             {
                 var di = new ReplicationService.DataTable();
                 ReadDataTable(di, rdr);
                 while (rdr.Read())
                 {
                     ReadData(di, rdr);
                 }
                 if (pd.Tables == null)
                 {
                     pd.Tables = new List <ReplicationService.DataTable>();
                 }
                 pd.Tables.Add(di);
             } while (rdr.NextResult());
         }
     }
     pd.HasContent = pd.Tables != null;
     Log.Write("\t{0} Id={1}{2} ...", itemName, itemId.ToString(), SqlExtension.Id2String(itemId));
     pd.ItemName = itemName; // обязательно!
     pd.ItemId   = itemId;
     _client.SendPackage(_clientId, _sessionId, pd);
     using (var cmd = _cnn.CreateCommand())
     {
         cmd.CommandType = CommandType.StoredProcedure;
         cmd.CommandText = String.Format("a2repl.set_{0}_sent", itemName);
         cmd.Parameters.AddWithValue("@sessionid", _sessionId);
         cmd.Parameters.AddWithValue("@id", itemId);
         cmd.ExecuteNonQuery();
     }
     Log.WriteLine("   успешно");
     _counters[itemName]++;
     return(true);
 }
Example #3
0
 Boolean ProcessPackage(ref Boolean bError)
 {
     // получаем ID и имя элемента для отправки
     ReplicationService.DataForGet dg = _client.GetItemForGet(_clientId, _sessionId);
     if (dg == null)
     {
         return(false); // нет данных
     }
     Log.Write("\t{0} Id={1}{2} ...", dg.TableName, dg.Id.ToString(), SqlExtension.Id2String(dg.Id));
     if (!ProcessOneElement(dg, ref bError))
     {
         Log.WriteLine("   ошибка");
         return(false);
     }
     Log.WriteLine("   успешно");
     return(true);
 }
Example #4
0
        protected void ReadData(ReplicationService.DataTable Table, IDataReader rdr)
        {
            if (Table.Rows == null)
            {
                Table.Rows = new List <ReplicationService.DataRow>();
            }
            if (String.IsNullOrWhiteSpace(Table.TableName))
            {
                Table.TableName = rdr.GetString(0);
            }
            int ix = 1;
            var r  = new ReplicationService.DataRow();

            r.Values = new List <String>();
            r.Id     = rdr.GetInt64(ix++);
            r.Gen    = rdr.GetInt32(ix++);
            for (int i = ix; i < rdr.FieldCount; i++)
            {
                r.Values.Add(SqlExtension.ToStringValue(rdr.GetValue(i)));
            }
            Table.Rows.Add(r);
        }
        protected void ProcessSingleTable(ReplicationService.DataTable table)
        {
            // %%%% TODO: Наличие параметров в клиентской базе!!!!!
            if ((table.TableName == null) || (table.Columns == null))
            {
                return;
            }
            if (!_counters.ContainsKey(table.TableName))
            {
                _counters.Add(table.TableName, 0);
            }
            if (table.Rows == null)
            {
                return;
            }
            if (table.Columns == null)
            {
                return;
            }
            String cmdText = String.Format("a2repl.{0}_update", table.TableName);

            using (var cmd = _cnn.CreateCommand())
            {
                cmd.CommandText = cmdText;
                cmd.CommandType = CommandType.StoredProcedure;

                SqlCommandBuilder.DeriveParameters(cmd);
                var prmMap = new Dictionary <String, Int32>();
                for (int i = 0; i < cmd.Parameters.Count; i++)
                {
                    prmMap.Add(cmd.Parameters[i].ParameterName, i);
                }

                // Параметры уже прочитаны, добавлять их не нужно

                /*
                 * //cmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.BigInt));
                 * //cmd.Parameters.Add(new SqlParameter("@Gen", SqlDbType.Int));
                 * for (int i = 0; i < table.Columns.Count; i++)
                 * {
                 *  var c = table.Columns[i];
                 *  if (prmMap.ContainsKey("@" + c.Name))
                 *      cmd.Parameters.Add(new SqlParameter("@" + c.Name, c.DataType));
                 * }
                 */
                foreach (var r in table.Rows)
                {
                    cmd.Parameters["@Id"].Value  = r.Id;
                    cmd.Parameters["@Gen"].Value = r.Gen;
                    if (r.Values != null)
                    {
                        Debug.Assert(table.Columns.Count == r.Values.Count);
                        for (int i = 0; i < r.Values.Count; i++)
                        {
                            var c       = table.Columns[i];
                            var prmName = "@" + c.Name;
                            if (prmMap.ContainsKey(prmName))
                            {
                                cmd.Parameters[prmName].Value = SqlExtension.ConvertTo(r.Values[i], (SqlDbType)table.Columns[i].DataType);
                            }
                        }
                        cmd.ExecuteNonQuery();
                        _counters[table.TableName]++;
                    }
                }
            }
        }