powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Из Excel в SQL-таблицу
30 сообщений из 30, показаны все 2 страниц
Из Excel в SQL-таблицу
    #38599435
balalexv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую!

Возникла задача, озвученная в заголовке. Хотелось бы определиться с подходом, каким образом это делать (на всякий случай, я определенно не спец, посему могу спрашивать какие-то банальные вещи и выражать какие-то опасения, которые на самом деле беспочвенны :)), чтобы потом не было мучительно больно из-за неправильно выбранного.

Сама задача в дальнейшем была разбита на две подзадача (правильно ли?):
1. Загрузить данные из Excel в DataTable. При этом, главный вопрос, который возникает (насколько я понимаю) - каким образом сообщить программе, какие типы данных хранятся в таблице (которая в общем случае неизвестна, но предполагается, что INFORMATION_SCHEMA.COLUMNS, например, доступен), чтобы при генерации DataTable он использовал нужные.
2. Загрузить DataTable в SQL-таблицу.

С пунктом 2 вроде проблем нет, посему в дальнейшем вопрос только по п.1.

Результаты гуглинга выделили три подхода, которые теоретически могут позволить выполнить задачу:
1. через Microsoft.Office.Interop.Excel;
2. через провайдер Microsoft.ACE.OLEDB.12.0 (например);
3. через Open XML.

Дальнейший гуглинг показал:

Минусы первого подхода, в том, что он требует наличия Excel на клиентской машине (что не фатально, но напрягает) + запускает отдельный процесс (какие-нибудь некорректные завершения программы могут оставлять лишние процессы в памяти, предполагаю).

Минусы второго подхода - я так понял, требуют установленной библиотеки на клиентских компьютерах + какие-то проблемы с 64-битными системами и т.п. ( http://social.msdn.microsoft.com/Forums/ru-RU/9b28f96f-f058-4641-9871-ccd3e380a346/-64-microsoftjetoledb40-provider-is-not?forum=fordataru). Решение проблемы вроде как описано, но меня настораживает необходимость менять глобальные настройки проекта (оговорюсь сразу, на что именно они в дальнейшем повлияют - понятия не имею :) ) из-за подключения одной библиотеки (что буду делать, если какая-то другая библиотека потребует обратного переключения, я не очень понимаю).

Минусы третьего подхода - по ощущениям, намного выше "входной порог", по сравнению с первыми (а готового решения не нашел).

Собственно вопрос - правильно ли озвучены минусы и какой подход на самом деле предпочтительнее? При этом, остается задача "сообщить" нужные типы столбцов (кроме как банального switch, на основании данных из INFORMATION_SCHEMA, способа не нашел, на решение как-то не нравится)
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599561
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
balalexv,

Excel - DataTable - SqlServer используя SqlBulk
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599569
balalexv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VIT2708balalexv,
Excel - DataTable - SqlServer используя SqlBulk
Спасибо за ответ. На всякий случай уточню, SqlBulk мне поможет, насколько я понимаю, только на стадии DataTable -> SqlServer? Если да, то эта стадия мне более-менее вроде понятна, вопрос больше в Excel->DataTable. В принципе, как альтернативный вариант я готов буду рассмотреть вариант изначального сохранения в csv, например (что позволит спокойно пользоваться этой командой, насколько я понял), но сначала хотелось бы рассмотреть варианты с xls/xlsx.
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599576
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
balalexv,

SqlBulk используют для масовой вставки записей на Sql server,

А для загрузки из Excel в DataTable вариант 2

2. через провайдер Microsoft.ACE.OLEDB.12.0 (например);

Простой пример

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 String name = "Sheet 1";
            String constr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
                            "D:\\Test.xls" +
                            ";Extended Properties='Excel 8.0;HDR=YES;';";

            OleDbConnection con = new OleDbConnection(constr);
            OleDbCommand oconn = new OleDbCommand("Select * From [" + name + "$]", con);
            con.Open();

            OleDbDataAdapter sda = new OleDbDataAdapter(oconn);
            
            sda.Fill(data);
            con.Close();



Но лучше написать какой нибудь метод который будет распознавать какой файл выбран (xls или xlsx) а потом выбирать провайдер
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599583
balalexv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VIT2708А для загрузки из Excel в DataTable вариант 2
Собственно остается вопрос, почему именно вариант 2. Насколько беспочвенны мои опасения, изложенные в "минусы второго подхода"? В частности, нет ли риска, что если я выполню рекомендации msdn:

Проблема в том, что вы компилируете свое решение как “Any CPU”. По умолчанию решение на 64х битной системе будет работать как 64х битный процесс, а оба JET и ACE OLEDB провайдера существуют только в x86 версии. 64х битный процесс не может загрузить x86 компоненты, поэтому и происходит такая ошибка.

, то в дальнейшем это повлечет за собой проблемы?

И что касается требуемой библиотеки - я так понимаю речь о http://support.microsoft.com/kb/239114/ru. Будет ли требоваться устанавливать сей объект на каждом клиентском компьютере?
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599586
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
balalexv,

Создать отдельный класс и использовать тот провайдер который необходим
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599700
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использовать SSIS (как частный случай - DTS wizard).
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599744
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
balalexvВозникла задача, озвученная в заголовке. Хотелось бы определиться с подходом, каким образом это делать
Если это разовые задачи, то в состав MS SQL входит утилита "Импорт и экспорт данных".
Она имеется и в бесплатной версии "MS SQL Express"
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599750
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Если это разовые задачи, то в состав MS SQL входит утилита "Импорт и экспорт данных".
это и есть DTS wizard
и это решение подоходит не только для разовых задач - перед импортом данных DTS wizard формирует SSIS package, который можно сохранить отдельно, и вызывать в серверном джобе (или в обычных Sheduled Tasks, запуская SSIS-пакет посредством DTExec.exe).
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599753
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Сон Веры Павловныэто и есть DTS wizard
Я в курсе, но объяснил на более понятном для новичка языке,
так как пункт меню "DTS wizard" пропал начиная с MS SQL 2005
============
Вообще-то вариант, когда пользователь создает в базе таблицы не является хорошей практикой.
Лучше присосаться через OLE и тащить в таблицы базы только нужную информацию
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599821
igr_ok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
balalexvПриветствую!
2. через провайдер Microsoft.ACE.OLEDB.12.0 (например);
Возможная проблема - при обращении к листу предполагается,что его имя уже известно, а это может быть и не так. Решение здесь
Есть еще и другие проблемы, но они все решаемы.
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599861
balalexv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответы. Для начала, сделаю несколько оговорок:
1. Интерфейс MS SQL не предполагается доступным пользователю (но запуск созданных процедур на сервере доступен);
2. Задача не только не "разовая", но и решена должна быть в общем случае (то есть и для таблиц с неизвестной заранее структурой, при этом не предполагается "ручками" создавать процедуру для каждой);
3. Создание таблиц не предполагается, предполагается только добавление записей в созданные.

Насколько я понял, реализован SSIS все равно через провайдеры, со всеми присущими этому плюсами и минусами (правильно ли?). Если так, то сходу не могу уловить преимуществ (зато появляется "слабое звено" в виде использования MS SQL - насколько я понимаю, "грубая" реализация через провайдеры позволяет работать с любой СУБД).

Так или иначе, пока все-таки выбрал "подход №2", через провайдеры. Но сомнения, о которых говорил выше, по его поводу, пока остались..
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599869
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2. Задача не только не "разовая", но и решена должна быть в общем случае (то есть и для таблиц с неизвестной заранее структурой, при этом не предполагается "ручками" создавать процедуру для каждой);Никакого решения "в общем случае" невозможно, говорю как человек, уже много лет переливающий в msqql данные из экселя и не только. выхода ровно два:
1) писать макрос, раскидывающий данные по таблицам (лично мне так проще),
2) закинуть все данные во временную таблицу, аналогичную экселевской, и разбросать sql-запросами
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599870
balalexv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AntonariyНикакого решения "в общем случае" невозможно...
Ну общность решения в любом случае условна - в момент вызова требуемой процедуры по крайней мере название то таблицы известно :). Соответственно, известна и ее структура (с вероятностью, близкой к 100%, ее отдаст любая СУБД). Нет, реализация через провайдеров меня в этом смысле устроила - пока не встретил ситуаций, в которых не смог добавить записи в таблицы, беспокоят лишь ограничения, о которых упоминал.
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599872
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
balalexv Соответственно, известна и ее структура (с вероятностью, близкой к 100%, ее отдаст любая СУБД).а какая сущность должна догадаться о правилах разбора произвольных входящих данных в таблицы пусть даже и известной структуры?
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599873
balalexv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariybalalexv Соответственно, известна и ее структура (с вероятностью, близкой к 100%, ее отдаст любая СУБД).а какая сущность должна догадаться о правилах разбора произвольных входящих данных в таблицы пусть даже и известной структуры?
Нет, заголовки то столбцов в xls-файле я готов создавать совпадающими с ними же в БД. А отсутствующие столбцы пусть тянутся по значениям по умолчанию/NULL.
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599874
balalexv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Либо, как вариант (собственно и реализованный, через SqlBulk) - просто поддерживается порядок столбцов, совпадающий с таблицей-получателем.
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599898
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
balalexv2. Задача не только не "разовая", но и решена должна быть в общем случае (то есть и для таблиц с неизвестной заранее структурой, при этом не предполагается "ручками" создавать процедуру для каждой);
А вообще откуда задача появилась?

Если у пользователей есть потребность хранения каких-то данных, то надо писать базу и интерфейс к ней, а не пытаться аггрегировать хаотичные электронные таблицы.
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599915
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
balalexvЛибо, как вариант (собственно и реализованный, через SqlBulk) - просто поддерживается порядок столбцов, совпадающий с таблицей-получателем.Получается, данные не произвольные, а 1-в-1
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599920
balalexv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cat2,

Интерфейс и база имеется, разумеется :). Тем не менее, по опыту в качестве пользователя, так сказать, нередко возникала необходимость загрузить большое количество записей одновременно (в простейшем случае - заполнить какой-нибудь справочник на основании данных "со стороны"). Либо перенос данных, заполненных изначально в Excel (в случаях, если функциональность DataGridView, например, недостаточна - хотя понятно, что сей недостаток теоретически устраним, вопрос времени). Заставлять же пользователей переносить данные из Excel в БД ручками считаю крайне нехорошей практикой (и, к моему удивлению, весьма распространенной).

Понятно, что реально процедура будет юзаться от силы на 5% таблиц, но проще уж один раз универсальную процедуру написать и забыть про нее потом, чем каждый раз писать новую.
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599923
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
balalexvЗаставлять же пользователей переносить данные из Excel в БД ручками считаю крайне нехорошей практикой
Использование Excelя - вообще плохая практика
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599929
balalexv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AntonariybalalexvЛибо, как вариант (собственно и реализованный, через SqlBulk) - просто поддерживается порядок столбцов, совпадающий с таблицей-получателем.Получается, данные не произвольные, а 1-в-1
В такой реализации - да. В этом смысле мне бы больше понравилась процедура с непосредственным указанием столбцов. Тем не менее, уровень "универсальности" реализации через SqlBulk меня пока что устраивает (хотя и вынуждает добавлять "лишние" столбцы). В любом случае, "общность решения" ведь предполагалась не в произвольной/хаотичной структуре входящего файла, а в том, что одна реализация позволит заполнять в будущем в любые таблицы, не прибегая к коду. Если это не следовало из моих слов ранее, прошу прощения, я большой любитель излишне витиеватых выражений :).
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599933
balalexv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cat2Использование Excelя - вообще плохая практика
Как очень большой сторонник полной автоматизации всего, что возможно, я вообще считаю наличие пользователей плохой практикой. Тем не менее, пока приходится мириться что с ними, что с используемым ими Excel-ем :).
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599944
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
balalexvCat2Использование Excelя - вообще плохая практика
Как очень большой сторонник полной автоматизации всего, что возможно, я вообще считаю наличие пользователей плохой практикой. Тем не менее, пока приходится мириться что с ними, что с используемым ими Excel-ем :).


использование экселя для обмена данными - плохая практика
так понятнее?
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599949
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
balalexvКак очень большой сторонник полной автоматизации всего, что возможно, я вообще считаю наличие пользователей плохой практикой
Да. 90% из них можно заменить сканером
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599952
balalexv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,

Для начала, хочу пояснить, речь все-таки в первую очередь не идет об обмене данными, при котором источником является другая БД, например (в таком бы случае разумеется речь бы шла в первую очередь о csv/xml). Тем не менее, я на самом деле был вполне серьезен по поводу "полной автоматизации" - теоретически я вполне могу себе представить, что моя БД будет красиво интегрирована в светлом будущем со всеми БД контрагентов, скажем так (и изящно обмениваться xml-сообщениями, например). Таким образом я избавлюсь от первой причины загрузки Excel-файлов. Вторую причину - недостаток функциональности DataGridView (классический пример - "условное форматирование" с цветовой схемой) я тоже теоретически в светлом будущем обойду (быть может, просто заменив DataGridView).

Впрочем, я вполне допускаю, что мне просто еще не встретилась такая ERP, при использовании которой не было бы вообще желания открывать Excel, потому что предоставленного функционала достаточно. Тем не менее, моя скромная программка определенно не дошла до такой точки :).
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599954
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
balalexvнедостаток функциональности DataGridView (классический пример - "условное форматирование" с цветовой схемой) я тоже теоретически в светлом будущем обойду
Без проблем рисуешь что надо в CellPainting или CellFormatting
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599955
igr_ok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
balalexv Тем не менее, уровень "универсальности" реализации через SqlBulk меня пока что устраивает (хотя и вынуждает добавлять "лишние" столбцы). Воспользуйтесь SqlBulkCopyColumnMapping чтобы указать только те столбцы, что вам нужны.
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599957
balalexv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cat2balalexvнедостаток функциональности DataGridView (классический пример - "условное форматирование" с цветовой схемой) я тоже теоретически в светлом будущем обойду
Без проблем рисуешь что надо в CellPainting или CellFormatting
Классический != единственный, к сожалению :)
...
Рейтинг: 0 / 0
Из Excel в SQL-таблицу
    #38599963
balalexv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
igr_ok,

Спасибо, судя по всему - именно то, чего не хватало.
...
Рейтинг: 0 / 0
30 сообщений из 30, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Из Excel в SQL-таблицу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]