예제 #1
0
 public SqlTransactionRepository(string dsn, ISpecificationFinder specFinder, string[] indexedSegments, string schema = "dbo", string commonSchema = "dbo", int segmentBatchSize = 1000, string sqlDateType = "date")
     : base(dsn, schema)
 {
     _commonDb      = new DbCreation <T>(dsn, commonSchema, sqlDateType);
     _transactionDb = new DbCreation <T>(dsn, schema, sqlDateType);
     _schemaEnsured = false;
     _batchSize     = segmentBatchSize;
     _segmentBatch  = new SegmentBatch <T>(this);
     _specs         = new Dictionary <string, SegmentSpecification>();
     foreach (var segmentId in indexedSegments)
     {
         var spec = specFinder.FindSegmentSpec("5010", segmentId.Trim());
         _specs.Add(segmentId.Trim(), spec);
     }
 }
예제 #2
0
        internal virtual void ExecuteBatch(SqlTransaction tran)
        {
            if (_segmentBatch.SegmentCount > 0)
            {
                try
                {
                    using (var conn = tran == null ? new SqlConnection(_dsn) : tran.Connection)
                    {
                        if (conn.State != System.Data.ConnectionState.Open)
                        {
                            conn.Open();
                        }
                        using (var sbc = new SqlBulkCopy(conn))
                        {
                            sbc.DestinationTableName = string.Format("[{0}].Segment", _schema);
                            foreach (DataColumn c in _segmentBatch._segmentTable.Columns)
                            {
                                sbc.ColumnMappings.Add(c.ColumnName, c.ColumnName);
                            }
                            sbc.WriteToServer(_segmentBatch._segmentTable);

                            foreach (var pair in _segmentBatch._parsedTables)
                            {
                                sbc.ColumnMappings.Clear();

                                sbc.DestinationTableName = string.Format("[{0}].[{1}]", _schema, pair.Key);
                                foreach (DataColumn c in pair.Value.Columns)
                                {
                                    sbc.ColumnMappings.Add(c.ColumnName, c.ColumnName);
                                }
                                sbc.WriteToServer(pair.Value);
                            }
                        }
                    }
                    _segmentBatch = new SegmentBatch <T>(this);
                }
                catch (Exception exc)
                {
                    Trace.WriteLine(exc.Message);
                    Trace.TraceInformation("Error Saving {0} segments to db starting with {1}.",
                                           _segmentBatch.SegmentCount,
                                           _segmentBatch.StartingSegment);

                    throw;
                }
            }
        }