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

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

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



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

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

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

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

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

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

цикл - For Loop Component

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

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

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

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

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

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

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

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

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

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

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

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

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

Вы рассказываете про свой код, и при этом пишете, что "своего кода нет совсем"...
...
Рейтинг: 0 / 0
Помогите с dtsx-пакетом
    #39946381
Oleg_SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Помогите с dtsx-пакетом
    #39946439
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg_SQL
Второй просто назначает соединение для каждого файла:
Попробуйте в свойствах эксельного коннекта установить значение RetainSameConnection в True
...
Рейтинг: 0 / 0
Помогите с dtsx-пакетом
    #39946463
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

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

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

Но зависит от того, что там делается дальше, потому что этот "цикл по листам" тоже очень загадочная штука, что там, непонятно.
...
Рейтинг: 0 / 0
Помогите с dtsx-пакетом
    #39946487
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Помогите с dtsx-пакетом
    #39946492
Oleg_SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Критик
alexeyvg,

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


В том то и дело, что файл остается заблокированным все время выполнения пакета. Т.е. блокируются все файлы по мере начала цикла по листам (Excel)
...
Рейтинг: 0 / 0
Помогите с dtsx-пакетом
    #39946494
Oleg_SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Помогите с dtsx-пакетом
    #39946495
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg_SQL,

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

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

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

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

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

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

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


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