SSIS 2012 - переменная пуста при втором выполнении скрипта

Используйте BFG Repo-Cleaner , более быструю и быструю альтернативу git-filter-branch, специально разработанную для удаления нежелательных файлов из истории Git.

Аккуратно следуйте за использованием команды , основная часть - это:

$ java -jar bfg.jar --strip-blobs-bigger-than 100M my-repo.git

Любые файлы размером более 100 МБ (которые не входят в ваш последний коммит ) будут удалены из вашей истории хранилища Git. Затем вы можете использовать git gc для очистки мертвых данных:

$ git gc --prune=now --aggressive

BFG обычно не менее 10-50x быстрее, чем работает git-filter-branch, и, как правило, для использования.

Полное раскрытие: я являюсь автором BFG Repo-Cleaner.

2
задан Hadi 22 March 2019 в 05:28
поделиться

1 ответ

Попытка выяснить проблему

Из следующей документации по методу OleDbDataAdapter.Fill (DataTable, Object) :

ВНИМАНИЕ [1149 ]
При использовании объектов ADO Recordset или Record в сочетании с приложениями .NET Framework всегда вызывайте Close, когда вы закончите. Это гарантирует своевременное освобождение базового соединения с источником данных, а также предотвращает возможные нарушения доступа из-за того, что неуправляемые объекты ADO возвращаются сборщиком мусора, когда существующие ссылки еще существуют.

Также имеется в виду Заполнение DataSet набором записей ADO или Record - документация :

Обратите внимание, что перегрузка OleDbDataAdapter.Fill, которая принимает DataSet и Объект ADO неявно вызывает Close объекта ADO, когда операция Fill завершена. Вам необходимо явно закрыть объект ADO Recordset или Record после вызова перегрузки OleDbDataAdapter.Fill, которая принимает DataTable.

Это означает, что при вызове метода Fill через RecordSet вы должны закрыть его перед повторным использованием, иначе строки не будут возвращены.


Возможные обходные пути

Я действительно не знаю, как закрыть набор записей из переменной Object, но я попытаюсь предоставить некоторые возможные обходные пути:

(1) Сохранение в DataTable

В приведенной ниже ссылке они упомянули следующий обходной путь:

  1. Как только мой Recordset @[User::FilePath] будет заполнен, я использую задачу сценария и Заполните его в DataSet ds, используя OledbDataAdapter и DataTable.

  2. Затем, в той же задаче сценария, я поместил значение ds в новую переменную типа объекта @[User::FilePathDataTable].

При этом тип данных FilePathDataTable становится System.Data.DataTable.

Этот набор данных можно легко использовать любое количество раз внутри цикла For-Each.

Я не использую метод DataAdapter.Fill() внутри цикла ForEach для ssis. Я просто присваиваю значение @[User::FilePathDataTable] новому набору данных и использую его для итераций.

Ссылка

(2) Использование источника набора записей

Вместо использования компонента Script для генерации строк из переменной Object попробуйте сделать это с помощью RecordSet Source.

(3) Приведение переменной в качестве набора записей

Я не проверял этот подход, и я не уверен, будет ли он работать с объектной переменной

Требуется ссылка на объекты данных Microsoft ActiveX.

List<PublicHoliday> PublicHolidays = new List<PublicHoliday>();

var rs = ((ADODB.Recordset)Variables.LISTPublicHolidays);
OleDbDataAdapter A = new OleDbDataAdapter();
DataTable dt = new DataTable();
A.Fill(dt, rs);

foreach (DataRow row in dt.Rows)
{
    object[] array = row.ItemArray;
    var Public = new PublicHoliday()
    {
        DateKey = int.Parse(array[0].ToString()),
        FullDateAlternateKey = DateTime.Parse(array[1].ToString())
    };
    PublicHolidays.Add(Public);
}
rs.Close();

Обновление 1

на основе приведенных ниже комментариев попробуйте удалить метод rs.Close(); из первого и второго сценария перед выполнением метода Fill используйте метод rs.MoverFirst(), чтобы иметь возможность извлекать информацию из набора записей.

Третий подход удален по следующей ссылке:

  • [1113 ] Методы MoveFirst, MoveLast, MoveNext и MovePrevious (ADO)
0
ответ дан Hadi 22 March 2019 в 05:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: