Импортировать файл csv/excel в базу данных sql asp.net

Я запускаю проект с визуальной студией asp.net 2008/SQL 2000 (2005 в будущем) с помощью С#.

Сложная часть для меня заключается в том, что существующая схема БД часто изменяется, а столбцы файлов импорта все должны быть сопоставлены с существующей схемой дБ, так как они могут не совпадать друг с другом по именам столбцов. (Существует таблица поиска, которая предоставляет схему таблиц с именами столбцов, которые я буду использовать)

Я изучаю различные способы подхода к этому и нуждаюсь в советах экспертов. Есть ли какие-либо существующие элементы управления или рамки, которые я могу использовать для выполнения этого?

До сих пор я исследовал элемент управления FileUpload.NET, а также некоторые сторонние элементы управления загрузкой, чтобы выполнить загрузку, такую ​​как SlickUpload, но загруженные файлы должны быть < 500MB

Следующая часть - это чтение моего csv/excel и разбор его для отображения пользователю, чтобы они могли сопоставлять его с нашей схемой db. Я видел CSVReader и другие, но для Excel это более сложно, так как мне нужно поддерживать разные версии.

По существу Пользователь, выполняющий этот импорт, будет вставлять и/или обновлять несколько таблиц из этого файла импорта. Существуют и другие дополнительные требования, такие как сопоставление записей, но и предварительный просмотр записей импорта, но я хочу понять, как это сделать в первую очередь.

Обновление: я закончил использование csvReader с LumenWorks.Framework для загрузки файлов csv.

Ответ 1

Я использую csvReader из LumenWorks.Framework для загрузки и импорта CSV файлов в таблицу sql и DataTable в памяти, которую я создаю на основе импортированных столбцов.

У меня также есть пользовательская карта полей в ui и продолжайте проверять и готовить данные для импорта, помещая каждую запись в качестве вставки/обновления/ошибки. Затем я создаю/заполняю строго типизированный DataSet для каждой таблицы, которая будет затронута, и создайте запросы вставки/обновления для метода Enterprise Library UpdateDataset().

Затем я отправляю транзакцию для вставки/обновления базы данных. -

Отображение представляет собой сетку с 4 столбцами. (имя поля импорта, таблица назначения, имя целевого поля, игнорирование, состояние соответствия), причем таблица назначения и имена полей выбираются, которые обновляются на основе выбранной таблицы. Я динамически заполняю выбранные. Первоначально select combo заполняется 1 значением, если совпадение найдено, или выберите, если это не так. игнорировать позволяет пользователю игнорировать поле. статус соответствия - если поле было автоматически отображено

Ответ 2

Посмотрите отличную библиотеку FileHelpers - там статья о CodeProject об этом, и она размещала здесь.

Это чистый С#, и он может импортировать практически любой плоский файл, CSV, и он имеет дело с Excel. Импорт полностью настраивается - вы можете определять такие вещи, как разделители, строки и/или столбцы, чтобы пропускать и т.д. - множество опций.

Я успешно использовал его в различных проектах, и он работает безупречно - настоятельно рекомендуется.

Ответ 3

Вы можете легко создать IDataReader через файл Excel или CSV (см. http://support.microsoft.com/kb/316934).

Используете ли вы SQL Server в качестве механизма базы данных? Если это так, вы можете использовать класс SqlBulkCopy (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx), чтобы эффективно использовать ваш IDataReader, поместить соответствующие столбцы и сохранить результаты в вашем база данных.

Ответ 4

Я подозреваю, что могут существовать некоторые надежные и гибкие инструменты, которые помогут вам в этом потенциально очень сложном приложении, которое, как мы надеемся, вас укажет.

В то же время, вот функция, которую я нашел полезной для скрытия файла excel в DataTable. Эта версия предназначена только для первого листа. Это может послужить отправной точкой. Для чего-то подобного с csv файлами требуется только изменение строки подключения.

public static DataTable GetDataTableFromExcel(string SourceFilePath)
{
    string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                                "Data Source=" + SourceFilePath + ";" +
                                "Extended Properties=Excel 8.0;";

    using (OleDbConnection cn = new OleDbConnection(ConnectionString))
    {
        cn.Open();

        DataTable dbSchema = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
        if (dbSchema == null || dbSchema.Rows.Count < 1)
        {
            throw new Exception("Error: Could not determine the name of the first worksheet.");
        }

        string WorkSheetName = dbSchema.Rows[0]["TABLE_NAME"].ToString();

        OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM [" + WorkSheetName + "]", cn);
        DataTable dt = new DataTable(WorkSheetName);

        da.Fill(dt);

        return dt;
    }
}

Ответ 5

FileHelpers является вашим другом. Я использовал его с радостью для нескольких проектов, и это спасло меня от печали и труда.