Пример #1
0
        public WriteData(TableDefinition TableDefinition, string InputXml, string connString, int BulkSize = 50000)
        {
            typesList        = (new XSD2PGTypes()).Types;
            tableDefinition  = TableDefinition;
            ConnectionString = connString;
            // Задаю соединение
            _conn = new Npgsql.NpgsqlConnection(ConnectionString);
            _conn.Open();

            // Открываем операцию копирования
            _dbTableName = tableDefinition.schemaName + "." + tableDefinition.tableName;
            Console.WriteLine(tableDefinition.schemaName);
            _dbColumns = string.Join(",", tableDefinition.columns.Select(c => c.DBcolumn).ToArray());
            _wrt       = _conn.BeginBinaryImport(string.Format("COPY {0} ({1}) FROM STDIN (FORMAT BINARY)", _dbTableName, _dbColumns));
            xmlFile    = InputXml;

            bulkSize = BulkSize;
        }
Пример #2
0
        public async System.Threading.Tasks.Task ReadXmlAsync(Action <int> percentProgress)
        {
            string xmlPath = xmlFile;

            // Счетчик элементов
            int i = 0;

            // Инициализация XMLReader
            System.IO.FileStream         sr        = new System.IO.FileStream(xmlPath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
            System.Xml.XmlReaderSettings _settings = new System.Xml.XmlReaderSettings()
            {
                Async = true
            };
            System.Xml.XmlReader rdr = System.Xml.XmlReader.Create(sr, _settings);
            long lastPosition        = 0;

            while (await rdr.ReadAsync())
            {
                rdr.MoveToContent();

                // Новая строка
                BulkData _pair = new BulkData(tableDefinition, typesList);

                // Чтение элемента
                while (rdr.MoveToNextAttribute())
                {
                    if (rdr.NodeType == System.Xml.XmlNodeType.Attribute)
                    {
                        _pair.InsertCell(rdr.Name.ToLower(), rdr.Value);
                    }
                }
                i += 1;

                percentage = (int)Math.Round((double)(sr.Position / sr.Length), 2) * 100;

                if (lastPosition != sr.Position)
                {
                    lastPosition = sr.Position;

                    percentage = (int)(100.0 * lastPosition / sr.Length);
                    percentProgress(percentage);
                }

                // Вставка
                CancellationTokenSource source = new CancellationTokenSource();
                CancellationToken       token  = source.Token;
                await _wrt.WriteRowAsync(token, _pair.GetRow());



                //Проверяем достигнут ли максимальный размер списка
                if (i == bulkSize)
                {
                    await _wrt.CompleteAsync();

                    await _wrt.CloseAsync();

                    i    = 0;
                    _wrt = _conn.BeginBinaryImport(string.Format("COPY {0} ({1}) FROM STDIN (FORMAT BINARY)", _dbTableName, _dbColumns));
                    if (percentProgress != null)
                    {
                        percentProgress(percentage);
                    }
                }
            }

            await _wrt.CompleteAsync();

            if (percentProgress != null)
            {
                percentProgress(percentage);
            }
            await _wrt.CloseAsync();

            await _conn.CloseAsync();
        }