public SqlBatchItemSaverFactory(
            ITelemetryLogger logger,
            string connectionString,
            string databaseName,
            string tableName,
            long aliveRowsCount
            )

        {
            if (logger == null)
            {
                throw new ArgumentNullException("logger");
            }
            if (connectionString == null)
            {
                throw new ArgumentNullException("connectionString");
            }
            if (databaseName == null)
            {
                throw new ArgumentNullException("databaseName");
            }

            if (aliveRowsCount <= 0)
            {
                throw new ArgumentException("aliveRowsCount <= 0");
            }

            _logger = logger;
            _connectionString = connectionString;
            _databaseName = databaseName;
            _tableName = tableName;
            _aliveRowsCount = aliveRowsCount;

            try
            {
                using (var connection = new SqlConnection(_connectionString))
                {
                    connection.Open();

                    long lastRowId;
                    SqlHelper.DoPreparation(
                        connection,
                        null,
                        _databaseName,
                        _tableName,
                        _logger,
                        out lastRowId
                        );

                    _stackIdContainer = SqlHelper.ReadStackTable(
                        connection,
                        null,
                        _databaseName,
                        _tableName,
                        _logger
                        );

                    _lastRowIdContainer = new LastRowIdContainer(lastRowId);
                }
            }
            catch(Exception excp)
            {
                _safeMode = true;

                logger.LogHandledException(
                    this.GetType(),
                    "Error database patching. Telemetry is going offline.",
                    excp
                    );
            }
        }
Beispiel #2
0
        internal SqlBatchItemSaver(
            ITelemetryLogger logger,
            StackIdContainer stackIdContainer,
            string connectionString,
            string databaseName,
            string tableName,
            long aliveRowsCount,
            LastRowIdContainer lastRowIdContainer
            )
        {
            if (logger == null)
            {
                throw new ArgumentNullException("logger");
            }
            if (stackIdContainer == null)
            {
                throw new ArgumentNullException("stackIdContainer");
            }
            if (connectionString == null)
            {
                throw new ArgumentNullException("connectionString");
            }
            if (databaseName == null)
            {
                throw new ArgumentNullException("databaseName");
            }
            if (tableName == null)
            {
                throw new ArgumentNullException("tableName");
            }
            if (lastRowIdContainer == null)
            {
                throw new ArgumentNullException("lastRowIdContainer");
            }

            if (aliveRowsCount <= 0)
            {
                throw new ArgumentException("aliveRowsCount <= 0");
            }

            _logger = logger;
            _stackIdContainer = stackIdContainer;
            _databaseName = databaseName;
            _tableName = tableName;
            _aliveRowsCount = aliveRowsCount;
            _lastRowIdContainer = lastRowIdContainer;

            var connection = new SqlConnection(connectionString);
            connection.Open();
            try
            {
                var transaction = connection.BeginTransaction(IsolationLevel.Snapshot);

                _connection = connection;
                _transaction = transaction;
            }
            catch
            {
                #region close connection

                if (this._connection != null)
                {
                    try
                    {
                        this._connection.Close();
                    }
                    catch (Exception excp)
                    {
                        _logger.LogHandledException(this.GetType(), "ќшибка закрыти¤ конекшена в конструкторе", excp);

                    }
                }

                if (this._connection != null)
                {
                    try
                    {
                        this._connection.Dispose();
                    }
                    catch (Exception excp)
                    {
                        _logger.LogHandledException(this.GetType(), "ќшибка утилизации конекшена в конструкторе", excp);

                    }
                }

                #endregion

                throw;
            }

            var insertStackClause = InsertStackClause.Replace(
                "{_TableName_}",
                _tableName
                );

            _insertStackCommand = new System.Data.SqlClient.SqlCommand(insertStackClause, _connection, _transaction);
            _insertStackCommand.Parameters.Add("class_name", SqlDbType.VarChar, SqlHelper.ClassNameMaxLength);
            _insertStackCommand.Parameters.Add("method_name", SqlDbType.VarChar, SqlHelper.MethodNameMaxLength);
            _insertStackCommand.Parameters.Add("creation_stack", SqlDbType.VarChar, -1);
            _insertStackCommand.Parameters.Add("key", SqlDbType.VarChar, -1);
            _insertStackCommand.Prepare();

            _targetTable = new DataTable();
            _targetTable.Columns.Add("id", typeof(long));
            _targetTable.Columns.Add("date_commit", typeof(DateTime));
            _targetTable.Columns.Add("id_parent", typeof(long));
            _targetTable.Columns.Add("start_time", typeof(DateTime));
            _targetTable.Columns.Add("exception_message", typeof(string));
            _targetTable.Columns.Add("exception_stack", typeof(string));
            _targetTable.Columns.Add("time_interval", typeof(float));
            _targetTable.Columns.Add("id_stack", typeof(int));
            _targetTable.Columns.Add("exception_full_text", typeof(string));
            
            //создаем копировщик
            _copier = new SqlBulkCopy(
                connection,
                SqlBulkCopyOptions.TableLock
                //| SqlBulkCopyOptions.FireTriggers
                //| SqlBulkCopyOptions.UseInternalTransaction
                ,
                _transaction
                );
            _copier.DestinationTableName = tableName;
        }