Boolean ProcessPackage(Int64 pkgId) { var pd = new ReplicationService.PackageData(); var counters = new Dictionary <String, Int32>(); using (var cmd = _cnn.CreateCommand()) { cmd.CommandText = "a2repl.package_content_load_client"; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue(String.Empty, (Int32)0).Direction = ParameterDirection.ReturnValue; cmd.Parameters.AddWithValue("@pkgid", pkgId); 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>(); } if (!String.IsNullOrEmpty(di.TableName)) { pd.Tables.Add(di); if (!counters.ContainsKey(di.TableName)) { counters.Add(di.TableName, 0); } counters[di.TableName] += di.Rows.Count; } } while (rdr.NextResult()); } pd.HasMoreData = (Int32)cmd.Parameters[0].Value != 0; pd.HasContent = pd.Tables != null; Log.Write(" Id={0} ...", pkgId.ToString()); _client.SendPackageContent(_clientId, _sessionId, pd); } using (var cmd = _cnn.CreateCommand()) { cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = String.Format("a2repl.set_package_client_sent", pkgId); cmd.Parameters.AddWithValue("@pkgid", pkgId); cmd.ExecuteNonQuery(); } Log.WriteLine(" успешно"); foreach (var d in counters) { Log.WriteLine(" \tЭлементов {0} : {1}", d.Key.ToString(), d.Value.ToString()); } return(true); }
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); }
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]++; } } } }