/// <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(); } } }