импортировать CSV-файл / Excel в базу данных SQL Asp.net - PullRequest
10 голосов
/ 29 января 2009

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

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

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

До сих пор я исследовал элемент управления FileUpload .NET, а также некоторые сторонние элементы управления загрузкой для выполнения загрузки, такие как SlickUpload , но загружаемые файлы должны быть <500 МБ </p>

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

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

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

Ответы [ 5 ]

8 голосов
/ 29 января 2009

Обратите внимание на превосходную библиотеку FileHelpers - там есть статья о CodeProject , и она размещена здесь .

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

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

5 голосов
/ 29 января 2009

Вы можете легко создать 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, сопоставления столбцов и сохранения результатов в вашей базе данных.

3 голосов
/ 29 января 2009

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

Между тем, вот функция, которую я нашел полезной для преобразования файла 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;
    }
}
1 голос
/ 05 октября 2010

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

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

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

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

1 голос
/ 29 января 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...