powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Из Excel в SQL-таблицу
25 сообщений из 30, страница 1 из 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
25 сообщений из 30, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Из Excel в SQL-таблицу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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