Example #1
0
        /// <summary>
        /// Загружает поток в базу. Данные в формате CSV
        /// </summary>
        /// <param name="tableName">Таблица для загрузки</param>
        /// <param name="stream">Входной поток</param>
        /// <param name="modulator">Преобразования</param>
        /// <param name="csvQuotesType">Тип кавычек CSV</param>
        /// <param name="identity">true - отключать идентити спецификацию</param>
        public void LoadCsv(string tableName, StreamReader stream, Dictionary <string, Func <string, object> > modulator, CsvQuotesType csvQuotesType = CsvQuotesType.DoubleQuotes, bool identity = false)
        {
            DateTime begin = DateTime.Now;

            try
            {
                log.Info("Страт импорта данных в таблицу {0}", tableName);
                var firstLine = stream.ReadLine();
                if (string.IsNullOrEmpty(firstLine))
                {
                    throw new InvalidDataException();
                }

                connection.Open();
                using (IDbCommand cmd = connection.CreateCommand())
                {
                    if (identity)
                    {
                        EnableIdentityInsert(tableName, cmd);
                    }

                    var headers = CsvParser.Parse(firstLine, csvQuotesType);
                    cmd.CommandText = razor.Parse(
                        TemplateManager.GetInsertRowsStreamTemplate(),
                        new object[] { tableName, headers },
                        "insert rows stream").Replace("\r", string.Empty).Replace("\n", string.Empty);
                    var dataParams = new IDbDataParameter[headers.Length];
                    for (int i = 0; i < dataParams.Length; i++)
                    {
                        IDbDataParameter parameter = cmd.CreateParameter();
                        parameter.ParameterName = GetParameterName(headers, i);
                        parameter.DbType        = DbType.String;
                        dataParams[i]           = parameter;
                        cmd.Parameters.Add(parameter);
                    }

                    for (var line = stream.ReadLine(); line != null; line = stream.ReadLine())
                    {
                        var lineValues = CsvParser.Parse(line, csvQuotesType);
                        if (lineValues.Length != dataParams.Length)
                        {
                            throw new InvalidDataException();
                        }

                        for (int i = 0; i < lineValues.Length; i++)
                        {
                            if (modulator != null && modulator.ContainsKey(headers[i]))
                            {
                                dataParams[i].Value = modulator[headers[i]](lineValues[i]);
                            }
                            else
                            {
                                dataParams[i].Value = lineValues[i];
                            }
                        }

                        cmd.ExecuteNonQuery();
                    }

                    if (identity)
                    {
                        DisableIdentityInsert(tableName, cmd);
                    }
                }

                log.Info("Импорт завершен за {0}", DateTime.Now - begin);
            }
            finally
            {
                if (connection != null)
                {
                    connection.Close();
                }
            }
        }