Используйте 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.
Из следующей документации по методу OleDbDataAdapter.Fill (DataTable, Object) :
ВНИМАНИЕ [1149 ]
blockquote>
При использовании объектов ADO Recordset или Record в сочетании с приложениями .NET Framework всегда вызывайте Close, когда вы закончите. Это гарантирует своевременное освобождение базового соединения с источником данных, а также предотвращает возможные нарушения доступа из-за того, что неуправляемые объекты ADO возвращаются сборщиком мусора, когда существующие ссылки еще существуют.Также имеется в виду Заполнение DataSet набором записей ADO или Record - документация :
Обратите внимание, что перегрузка OleDbDataAdapter.Fill, которая принимает DataSet и Объект ADO неявно вызывает Close объекта ADO, когда операция Fill завершена. Вам необходимо явно закрыть объект ADO Recordset или Record после вызова перегрузки OleDbDataAdapter.Fill, которая принимает DataTable.
blockquote>Это означает, что при вызове метода Fill через RecordSet вы должны закрыть его перед повторным использованием, иначе строки не будут возвращены.
Возможные обходные пути
Я действительно не знаю, как закрыть набор записей из переменной Object, но я попытаюсь предоставить некоторые возможные обходные пути:
(1) Сохранение в DataTable
В приведенной ниже ссылке они упомянули следующий обходной путь:
Как только мой Recordset
@[User::FilePath]
будет заполнен, я использую задачу сценария и Заполните его в DataSet ds, используя OledbDataAdapter и DataTable.Затем, в той же задаче сценария, я поместил значение ds в новую переменную типа объекта
@[User::FilePathDataTable]
.При этом тип данных
FilePathDataTable
становитсяSystem.Data.DataTable
.Этот набор данных можно легко использовать любое количество раз внутри цикла For-Each.
Я не использую метод
blockquote>DataAdapter.Fill()
внутри цикла ForEach для ssis. Я просто присваиваю значение@[User::FilePathDataTable]
новому набору данных и использую его для итераций.Ссылка
- Чтение набора записей несколько раз дает 0 строк
- Как повторно использовать Объект набора записей в службах SSIS
(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()
, чтобы иметь возможность извлекать информацию из набора записей. s>Третий подход удален по следующей ссылке: