Импортировать файл 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 является вашим другом. Я использовал его с радостью для нескольких проектов, и это спасло меня от печали и труда.