|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
Приветствую! Возникла задача, озвученная в заголовке. Хотелось бы определиться с подходом, каким образом это делать (на всякий случай, я определенно не спец, посему могу спрашивать какие-то банальные вещи и выражать какие-то опасения, которые на самом деле беспочвенны :)), чтобы потом не было мучительно больно из-за неправильно выбранного. Сама задача в дальнейшем была разбита на две подзадача (правильно ли?): 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, способа не нашел, на решение как-то не нравится) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2014, 17:06 |
|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
balalexv, Excel - DataTable - SqlServer используя SqlBulk ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2014, 19:25 |
|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
VIT2708balalexv, Excel - DataTable - SqlServer используя SqlBulk Спасибо за ответ. На всякий случай уточню, SqlBulk мне поможет, насколько я понимаю, только на стадии DataTable -> SqlServer? Если да, то эта стадия мне более-менее вроде понятна, вопрос больше в Excel->DataTable. В принципе, как альтернативный вариант я готов буду рассмотреть вариант изначального сохранения в csv, например (что позволит спокойно пользоваться этой командой, насколько я понял), но сначала хотелось бы рассмотреть варианты с xls/xlsx. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2014, 19:47 |
|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
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.
Но лучше написать какой нибудь метод который будет распознавать какой файл выбран (xls или xlsx) а потом выбирать провайдер ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2014, 19:55 |
|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
VIT2708А для загрузки из Excel в DataTable вариант 2 Собственно остается вопрос, почему именно вариант 2. Насколько беспочвенны мои опасения, изложенные в "минусы второго подхода"? В частности, нет ли риска, что если я выполню рекомендации msdn: Проблема в том, что вы компилируете свое решение как “Any CPU”. По умолчанию решение на 64х битной системе будет работать как 64х битный процесс, а оба JET и ACE OLEDB провайдера существуют только в x86 версии. 64х битный процесс не может загрузить x86 компоненты, поэтому и происходит такая ошибка. , то в дальнейшем это повлечет за собой проблемы? И что касается требуемой библиотеки - я так понимаю речь о http://support.microsoft.com/kb/239114/ru. Будет ли требоваться устанавливать сей объект на каждом клиентском компьютере? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2014, 20:05 |
|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
balalexv, Создать отдельный класс и использовать тот провайдер который необходим ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2014, 20:10 |
|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
Использовать SSIS (как частный случай - DTS wizard). ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2014, 04:53 |
|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
balalexvВозникла задача, озвученная в заголовке. Хотелось бы определиться с подходом, каким образом это делать Если это разовые задачи, то в состав MS SQL входит утилита "Импорт и экспорт данных". Она имеется и в бесплатной версии "MS SQL Express" ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2014, 10:53 |
|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
Cat2Если это разовые задачи, то в состав MS SQL входит утилита "Импорт и экспорт данных". это и есть DTS wizard и это решение подоходит не только для разовых задач - перед импортом данных DTS wizard формирует SSIS package, который можно сохранить отдельно, и вызывать в серверном джобе (или в обычных Sheduled Tasks, запуская SSIS-пакет посредством DTExec.exe). ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2014, 11:08 |
|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
Сон Веры Павловныэто и есть DTS wizard Я в курсе, но объяснил на более понятном для новичка языке, так как пункт меню "DTS wizard" пропал начиная с MS SQL 2005 ============ Вообще-то вариант, когда пользователь создает в базе таблицы не является хорошей практикой. Лучше присосаться через OLE и тащить в таблицы базы только нужную информацию ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2014, 11:21 |
|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
balalexvПриветствую! 2. через провайдер Microsoft.ACE.OLEDB.12.0 (например); Возможная проблема - при обращении к листу предполагается,что его имя уже известно, а это может быть и не так. Решение здесь Есть еще и другие проблемы, но они все решаемы. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2014, 14:07 |
|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
Спасибо за ответы. Для начала, сделаю несколько оговорок: 1. Интерфейс MS SQL не предполагается доступным пользователю (но запуск созданных процедур на сервере доступен); 2. Задача не только не "разовая", но и решена должна быть в общем случае (то есть и для таблиц с неизвестной заранее структурой, при этом не предполагается "ручками" создавать процедуру для каждой); 3. Создание таблиц не предполагается, предполагается только добавление записей в созданные. Насколько я понял, реализован SSIS все равно через провайдеры, со всеми присущими этому плюсами и минусами (правильно ли?). Если так, то сходу не могу уловить преимуществ (зато появляется "слабое звено" в виде использования MS SQL - насколько я понимаю, "грубая" реализация через провайдеры позволяет работать с любой СУБД). Так или иначе, пока все-таки выбрал "подход №2", через провайдеры. Но сомнения, о которых говорил выше, по его поводу, пока остались.. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2014, 16:02 |
|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
2. Задача не только не "разовая", но и решена должна быть в общем случае (то есть и для таблиц с неизвестной заранее структурой, при этом не предполагается "ручками" создавать процедуру для каждой);Никакого решения "в общем случае" невозможно, говорю как человек, уже много лет переливающий в msqql данные из экселя и не только. выхода ровно два: 1) писать макрос, раскидывающий данные по таблицам (лично мне так проще), 2) закинуть все данные во временную таблицу, аналогичную экселевской, и разбросать sql-запросами ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2014, 16:40 |
|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
AntonariyНикакого решения "в общем случае" невозможно... Ну общность решения в любом случае условна - в момент вызова требуемой процедуры по крайней мере название то таблицы известно :). Соответственно, известна и ее структура (с вероятностью, близкой к 100%, ее отдаст любая СУБД). Нет, реализация через провайдеров меня в этом смысле устроила - пока не встретил ситуаций, в которых не смог добавить записи в таблицы, беспокоят лишь ограничения, о которых упоминал. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2014, 16:47 |
|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
balalexv Соответственно, известна и ее структура (с вероятностью, близкой к 100%, ее отдаст любая СУБД).а какая сущность должна догадаться о правилах разбора произвольных входящих данных в таблицы пусть даже и известной структуры? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2014, 16:50 |
|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
Antonariybalalexv Соответственно, известна и ее структура (с вероятностью, близкой к 100%, ее отдаст любая СУБД).а какая сущность должна догадаться о правилах разбора произвольных входящих данных в таблицы пусть даже и известной структуры? Нет, заголовки то столбцов в xls-файле я готов создавать совпадающими с ними же в БД. А отсутствующие столбцы пусть тянутся по значениям по умолчанию/NULL. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2014, 16:57 |
|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
Либо, как вариант (собственно и реализованный, через SqlBulk) - просто поддерживается порядок столбцов, совпадающий с таблицей-получателем. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2014, 17:02 |
|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
balalexv2. Задача не только не "разовая", но и решена должна быть в общем случае (то есть и для таблиц с неизвестной заранее структурой, при этом не предполагается "ручками" создавать процедуру для каждой); А вообще откуда задача появилась? Если у пользователей есть потребность хранения каких-то данных, то надо писать базу и интерфейс к ней, а не пытаться аггрегировать хаотичные электронные таблицы. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2014, 18:36 |
|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
balalexvЛибо, как вариант (собственно и реализованный, через SqlBulk) - просто поддерживается порядок столбцов, совпадающий с таблицей-получателем.Получается, данные не произвольные, а 1-в-1 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2014, 19:04 |
|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
Cat2, Интерфейс и база имеется, разумеется :). Тем не менее, по опыту в качестве пользователя, так сказать, нередко возникала необходимость загрузить большое количество записей одновременно (в простейшем случае - заполнить какой-нибудь справочник на основании данных "со стороны"). Либо перенос данных, заполненных изначально в Excel (в случаях, если функциональность DataGridView, например, недостаточна - хотя понятно, что сей недостаток теоретически устраним, вопрос времени). Заставлять же пользователей переносить данные из Excel в БД ручками считаю крайне нехорошей практикой (и, к моему удивлению, весьма распространенной). Понятно, что реально процедура будет юзаться от силы на 5% таблиц, но проще уж один раз универсальную процедуру написать и забыть про нее потом, чем каждый раз писать новую. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2014, 19:08 |
|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
balalexvЗаставлять же пользователей переносить данные из Excel в БД ручками считаю крайне нехорошей практикой Использование Excelя - вообще плохая практика ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2014, 19:10 |
|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
AntonariybalalexvЛибо, как вариант (собственно и реализованный, через SqlBulk) - просто поддерживается порядок столбцов, совпадающий с таблицей-получателем.Получается, данные не произвольные, а 1-в-1 В такой реализации - да. В этом смысле мне бы больше понравилась процедура с непосредственным указанием столбцов. Тем не менее, уровень "универсальности" реализации через SqlBulk меня пока что устраивает (хотя и вынуждает добавлять "лишние" столбцы). В любом случае, "общность решения" ведь предполагалась не в произвольной/хаотичной структуре входящего файла, а в том, что одна реализация позволит заполнять в будущем в любые таблицы, не прибегая к коду. Если это не следовало из моих слов ранее, прошу прощения, я большой любитель излишне витиеватых выражений :). ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2014, 19:21 |
|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
Cat2Использование Excelя - вообще плохая практика Как очень большой сторонник полной автоматизации всего, что возможно, я вообще считаю наличие пользователей плохой практикой. Тем не менее, пока приходится мириться что с ними, что с используемым ими Excel-ем :). ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2014, 19:27 |
|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
balalexvCat2Использование Excelя - вообще плохая практика Как очень большой сторонник полной автоматизации всего, что возможно, я вообще считаю наличие пользователей плохой практикой. Тем не менее, пока приходится мириться что с ними, что с используемым ими Excel-ем :). использование экселя для обмена данными - плохая практика так понятнее? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2014, 19:55 |
|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
balalexvКак очень большой сторонник полной автоматизации всего, что возможно, я вообще считаю наличие пользователей плохой практикой Да. 90% из них можно заменить сканером ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2014, 20:08 |
|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
Изопропил, Для начала, хочу пояснить, речь все-таки в первую очередь не идет об обмене данными, при котором источником является другая БД, например (в таком бы случае разумеется речь бы шла в первую очередь о csv/xml). Тем не менее, я на самом деле был вполне серьезен по поводу "полной автоматизации" - теоретически я вполне могу себе представить, что моя БД будет красиво интегрирована в светлом будущем со всеми БД контрагентов, скажем так (и изящно обмениваться xml-сообщениями, например). Таким образом я избавлюсь от первой причины загрузки Excel-файлов. Вторую причину - недостаток функциональности DataGridView (классический пример - "условное форматирование" с цветовой схемой) я тоже теоретически в светлом будущем обойду (быть может, просто заменив DataGridView). Впрочем, я вполне допускаю, что мне просто еще не встретилась такая ERP, при использовании которой не было бы вообще желания открывать Excel, потому что предоставленного функционала достаточно. Тем не менее, моя скромная программка определенно не дошла до такой точки :). ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2014, 20:20 |
|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
balalexvнедостаток функциональности DataGridView (классический пример - "условное форматирование" с цветовой схемой) я тоже теоретически в светлом будущем обойду Без проблем рисуешь что надо в CellPainting или CellFormatting ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2014, 20:30 |
|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
balalexv Тем не менее, уровень "универсальности" реализации через SqlBulk меня пока что устраивает (хотя и вынуждает добавлять "лишние" столбцы). Воспользуйтесь SqlBulkCopyColumnMapping чтобы указать только те столбцы, что вам нужны. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2014, 20:30 |
|
Из Excel в SQL-таблицу
|
|||
---|---|---|---|
#18+
Cat2balalexvнедостаток функциональности DataGridView (классический пример - "условное форматирование" с цветовой схемой) я тоже теоретически в светлом будущем обойду Без проблем рисуешь что надо в CellPainting или CellFormatting Классический != единственный, к сожалению :) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2014, 20:38 |
|
|
start [/forum/topic.php?all=1&fid=20&tid=1403093]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
59ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
others: | 11ms |
total: | 178ms |
0 / 0 |