Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с dtsx-пакетом / 20 сообщений из 20, страница 1 из 1
11.04.2020, 16:12
    #39946174
Oleg_SQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с dtsx-пакетом
Суть - есть директория, по которой в цикле пробегаюсь по всем файлам Excel
Затем так же в цикле пробегаюсь по всем Листам файла и делаю некую обработку
Затем я хочу удалить отработанный файл.
Но он блокируется процессом (цикл по листам) и не удаляется. Даже если файлов несколько, то все одно они ВСЕ остаются заблокированными (иногда, правда один или два все же удаляются - рандомно)

Пробовал рвать соединение CurrConnDotNet в скрипте:

Код: c#
1.
2.
3.
            
            object rawConnection = Dts.Connections["SrcConnDotNet"].AcquireConnection(Dts.Transaction);
            Dts.Connections["SrcConnDotNet"].ReleaseConnection(rawConnection);



не помогает. Делал паузу, выжидал - без толку.

Если убрать цикл по листам - все удаляется....
На картинке тестовый вариант. Скрипт SQL - просто задержка в 1 сек для видимости работы.

Удалять в другом месте - не вариант.
...
Рейтинг: 0 / 0
11.04.2020, 16:47
    #39946182
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с dtsx-пакетом
Oleg_SQL,

Цикл как реализован - For Loop Component, или прямо в C# коде обычный foreach? Первый может удерживать блокировки, наверное.

Я бы кэшировал список файлов в отдельный List<Whatever> и потом уже по нему шел бы и удалял.
...
Рейтинг: 0 / 0
11.04.2020, 16:51
    #39946184
Oleg_SQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с dtsx-пакетом
Ennor Tiegael,

загружал картинку - не появилась...

цикл - For Loop Component

неужели нельзя как то "отвязать" файл после того как цикл по листам закончен?
...
Рейтинг: 0 / 0
12.04.2020, 07:38
    #39946294
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с dtsx-пакетом
Oleg_SQL,

Как вариант, можно закэшировать список файлов в переменную уровня пакета (Recordset, что ли. Саму переменную нужно объявлять как System.Object) и потом циклом идти по этой переменной, а не по реальным файлам на диске.

Только... идея с удалением имхо фундаментально порочна. Если в вашем коде где-то будут ошибки, вы не сможете запроцессить файлы заново, они же удалены. Придется заново доставать их там, откуда вы их брали, это может быть не всегда возможно. Я в такой ситуации сохранял отметку об успешном процессинге файла в таблице БД, после чего писал отдельный код, который шел по выборке из этой таблицы и перемещал файлы в архивную подпапку. Ее уже можно будет чистить отдельным процессом, например удалять файлы, если есть новая версия оного, которая была успешно загружена. Примерно как с бэкапами баз, тот же принцип.
...
Рейтинг: 0 / 0
12.04.2020, 10:28
    #39946306
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с dtsx-пакетом
Ennor Tiegael
Только... идея с удалением имхо фундаментально порочна. Если в вашем коде где-то будут ошибки, вы не сможете запроцессить файлы заново, они же удалены. Придется заново доставать их там, откуда вы их брали, это может быть не всегда возможно. Я в такой ситуации сохранял отметку об успешном процессинге файла в таблице БД, после чего писал отдельный код, который шел по выборке из этой таблицы и перемещал файлы в архивную подпапку.
Может, у ТС файлы копируются во временную папку для импорта?

И вопрос всё равно остаётся - как переместить файлы в архивную подпапку, если они заблокированы?

Такое бывает, наверное, нужно смотреть, какие там коннекты к файлам, может, сделалась копия коннекта, или есть какие то ссылки, которые нескоро удалятся сборщиком мусора...
...
Рейтинг: 0 / 0
12.04.2020, 11:33
    #39946315
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с dtsx-пакетом
alexeyvg
Ennor Tiegael
Только... идея с удалением имхо фундаментально порочна. Если в вашем коде где-то будут ошибки, вы не сможете запроцессить файлы заново, они же удалены. Придется заново доставать их там, откуда вы их брали, это может быть не всегда возможно. Я в такой ситуации сохранял отметку об успешном процессинге файла в таблице БД, после чего писал отдельный код, который шел по выборке из этой таблицы и перемещал файлы в архивную подпапку.
Может, у ТС файлы копируются во временную папку для импорта?

И вопрос всё равно остаётся - как переместить файлы в архивную подпапку, если они заблокированы?

Такое бывает, наверное, нужно смотреть, какие там коннекты к файлам, может, сделалась копия коннекта, или есть какие то ссылки, которые нескоро удалятся сборщиком мусора...
Если просто импортировать данные из Excel, то файлы ничто не держит, они удаляются, и никакие паузы ставить не надо.
Так что нужно смотреть свой код, где то там остались ссылки.
...
Рейтинг: 0 / 0
12.04.2020, 13:37
    #39946336
Oleg_SQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с dtsx-пакетом
alexeyvg,

так в том то и дело - своего кода нет совсем .
просто цикл For Loop Component по файлам в паке, в нем еще один For Loop Component по листам файла и после него попытка удалить файл стандартными средствами Задача Фаловой Системы. Примитивная задача, которая не работает.

Видимо я сам не смогу повлиять на сборщик мусор и тп зашитый в продукт Microsoft.

На ум приходит сделать некую папку в которую сначала Перемещать файлы, затем в цикле по файлам его сначала переименовывать (например добавлять к имени "tmp_" и тп) и уже с ним работать не удаляя в данной задаче совсем. А каждая следующая задача будет сначала пытаться очистить эту папку и потом работать далее...

P.S. Сегодня рисунок прикрепился...
...
Рейтинг: 0 / 0
12.04.2020, 14:02
    #39946344
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с dtsx-пакетом
Oleg_SQL,

Попробуйте цикл по листам сделать в скрипт-компоненте
...
Рейтинг: 0 / 0
12.04.2020, 18:00
    #39946374
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с dtsx-пакетом
Oleg_SQL
так в том то и дело - своего кода нет совсем .
Я вижу 2 таска типа "скрипт".
Что за установка соединения?

И как вы получаете данные из этих Excel-файлов, из листов?
...
Рейтинг: 0 / 0
12.04.2020, 18:03
    #39946375
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с dtsx-пакетом
Oleg_SQL
в нем еще один For Loop Component по листам файла
Я не понимаю, что под этим подразумевается.

Вы рассказываете про свой код, и при этом пишете, что "своего кода нет совсем"...
...
Рейтинг: 0 / 0
12.04.2020, 18:52
    #39946381
Oleg_SQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с dtsx-пакетом
alexeyvg
Oleg_SQL
в нем еще один For Loop Component по листам файла
Я не понимаю, что под этим подразумевается.

Вы рассказываете про свой код, и при этом пишете, что "своего кода нет совсем"...



Первый скрипт пустой (не убрал его перед снимком).
Второй просто назначает соединение для каждого файла:

Код: c#
1.
2.
3.
4.
5.
6.
7.
            String cs;

            cs = "Provider=Microsoft.ACE.OLEDB.12.0;";
            cs += "Data Source=" + Dts.Variables["User::FileName"].Value;
            cs += ";Extended Properties=" + '"' + "EXCEL 8.0;HDR=NO" + '"' + ";";

            Dts.Connections["SrcConnDotNet"].ConnectionString = cs;



Задача SQL - просто
Код: sql
1.
WAITFOR DELAY '00:00:00.5'




Третий скрипт - моя попытка удалить файл "руками". Но стандартная "Файловая система" на удаление - то же самая ошибка блокировки
...
Рейтинг: 0 / 0
12.04.2020, 22:36
    #39946439
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с dtsx-пакетом
Oleg_SQL
Второй просто назначает соединение для каждого файла:
Попробуйте в свойствах эксельного коннекта установить значение RetainSameConnection в True
...
Рейтинг: 0 / 0
13.04.2020, 00:35
    #39946463
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с dtsx-пакетом
alexeyvg,

Чисто логически рассуждая - тогда автору топика нужно будет удалять отработанный файл после перехода на следующий. Ну и в конце все равно пакет упадет.

Я бы бегал по листам в скрипт-компоненте, там можно самому управлять открытием-закрытием и удалением.
...
Рейтинг: 0 / 0
13.04.2020, 01:02
    #39946467
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с dtsx-пакетом
Критик
Чисто логически рассуждая - тогда автору топика нужно будет удалять отработанный файл после перехода на следующий. Ну и в конце все равно пакет упадет.
Почему это? Не обязательно.

Но зависит от того, что там делается дальше, потому что этот "цикл по листам" тоже очень загадочная штука, что там, непонятно.
...
Рейтинг: 0 / 0
13.04.2020, 08:13
    #39946487
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с dtsx-пакетом
Oleg_SQL
alexeyvg,

так в том то и дело - своего кода нет совсем .
просто цикл For Loop Component по файлам в паке, в нем еще один For Loop Component по листам файла и после него попытка удалить файл стандартными средствами Задача Фаловой Системы. Примитивная задача, которая не работает.

Видимо я сам не смогу повлиять на сборщик мусор и тп зашитый в продукт Microsoft.

На ум приходит сделать некую папку в которую сначала Перемещать файлы, затем в цикле по файлам его сначала переименовывать (например добавлять к имени "tmp_" и тп) и уже с ним работать не удаляя в данной задаче совсем. А каждая следующая задача будет сначала пытаться очистить эту папку и потом работать далее...

P.S. Сегодня рисунок прикрепился...

У меня сделано так
Сначала в скрипт таске получаем названия листов
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
        public void Main()
        {
            OleDbConnection _Connection = new OleDbConnection(Dts.Connections["ExcelConnection"].ConnectionString);
            DataTable _Tables;

            try {
                _Connection.Open();
                _Tables = _Connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
        
                Dts.Variables["User::ExcelSheetsCollection"].Value = _Tables;

                _Connection.Close();
                _Connection = null;

                Dts.TaskResult = (int)ScriptResults.Success;
            }
            catch (Exception ex)
            {
                Dts.TaskResult = (int)ScriptResults.Failure;
            }
        }



И потов в цикле бежим уже по [ User::ExcelSheetsCollection

Все работает.
В комментарии к пакету написано:
авторЕсли делать перебор листов в непосредственно в Foreach Loop Container,
то при выходе из него подключение к Excel не закрывается, и файл остаётся
блокированным. Его не удаётся удалить впоследствии.
...
Рейтинг: 0 / 0
13.04.2020, 09:03
    #39946492
Oleg_SQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с dtsx-пакетом
Критик
alexeyvg,

Чисто логически рассуждая - тогда автору топика нужно будет удалять отработанный файл после перехода на следующий. Ну и в конце все равно пакет упадет...


В том то и дело, что файл остается заблокированным все время выполнения пакета. Т.е. блокируются все файлы по мере начала цикла по листам (Excel)
...
Рейтинг: 0 / 0
13.04.2020, 09:09
    #39946494
Oleg_SQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с dtsx-пакетом
HandKot


У меня сделано так
Сначала в скрипт таске получаем названия листов
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
        public void Main()
        {
            OleDbConnection _Connection = new OleDbConnection(Dts.Connections["ExcelConnection"].ConnectionString);
            DataTable _Tables;

            try {
                _Connection.Open();
                _Tables = _Connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
        
                Dts.Variables["User::ExcelSheetsCollection"].Value = _Tables;

                _Connection.Close();
                _Connection = null;

                Dts.TaskResult = (int)ScriptResults.Success;
            }
            catch (Exception ex)
            {
                Dts.TaskResult = (int)ScriptResults.Failure;
            }
        }



И потов в цикле бежим уже по [ User::ExcelSheetsCollection

Все работает.
В комментарии к пакету написано:
авторЕсли делать перебор листов в непосредственно в Foreach Loop Container,
то при выходе из него подключение к Excel не закрывается, и файл остаётся
блокированным. Его не удаётся удалить впоследствии.


Спасибо, попробую так.
...
Рейтинг: 0 / 0
13.04.2020, 09:12
    #39946495
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с dtsx-пакетом
Oleg_SQL,

Я всегда читаю Excel через OpenXml.
...
Рейтинг: 0 / 0
13.04.2020, 12:07
    #39946560
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с dtsx-пакетом
Oleg_SQL,

а как Вы закрываете Excel после просмотра страниц документа или закрываете сам документ?
...
Рейтинг: 0 / 0
13.04.2020, 12:20
    #39946569
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с dtsx-пакетом
HandKot
Код: c#
1.
 Dts.Variables["User::ExcelSheetsCollection"].Value = _Tables;

А в этой переменной разве не должны храниться объекты с коннектом к экселю?

HandKot
И потов в цикле бежим уже по [ User::ExcelSheetsCollection
Это что означает, "в цикле бежим"? Вы используете этот Tables как коллекцию имён, или это прямо готовые источники данных?
Очевидно же, что где то "в цикле бежим" создаются коннекты, которые и держат.

PS Вы тут не услышите про волшебную кнопку "что бы было правильно".

Что бы найти ошибку в коде, нужно видеть код.
Или вы должны сами локализовать место, которое держит коннект (тогда никакого другого кода в пакете быть не должно), или нужно показать больше кода.
Вы сами выяснили, что объект коннекта в DTS эксельные файлы не держит, значит, его держит какой то другой код. Вот, и нужно его найти.

UPD Ой, думал, это код ТС, а потом эти коллекции объектов где то используются в пакете.
По любому, нужно больше кода, что бы разобраться.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с dtsx-пакетом / 20 сообщений из 20, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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