Swift 3 Version на тот случай, если кто-то просто захочет скопировать и amp; Вставить:
class TopAlignedCollectionViewFlowLayout: UICollectionViewFlowLayout {
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
if let attrs = super.layoutAttributesForElements(in: rect) {
var baseline: CGFloat = -2
var sameLineElements = [UICollectionViewLayoutAttributes]()
for element in attrs {
if element.representedElementCategory == .cell {
let frame = element.frame
let centerY = frame.midY
if abs(centerY - baseline) > 1 {
baseline = centerY
alignToTopForSameLineElements(sameLineElements: sameLineElements)
sameLineElements.removeAll()
}
sameLineElements.append(element)
}
}
alignToTopForSameLineElements(sameLineElements: sameLineElements) // align one more time for the last line
return attrs
}
return nil
}
private func alignToTopForSameLineElements(sameLineElements: [UICollectionViewLayoutAttributes]) {
if sameLineElements.count < 1 { return }
let sorted = sameLineElements.sorted { (obj1: UICollectionViewLayoutAttributes, obj2: UICollectionViewLayoutAttributes) -> Bool in
let height1 = obj1.frame.size.height
let height2 = obj2.frame.size.height
let delta = height1 - height2
return delta <= 0
}
if let tallest = sorted.last {
for obj in sameLineElements {
obj.frame = obj.frame.offsetBy(dx: 0, dy: tallest.frame.origin.y - obj.frame.origin.y)
}
}
}
}
Что вы будете делать с хранимыми процедурами, которые возвращают разные наборы результатов в зависимости от их параметров?
В любом случае вы можете настроить SqlDataAdapter.SelectCommand вместе с необходимыми параметрами, а затем вызвать метод FillSchema. Предполагая, что схему можно определить, вы получите DataTable, настроенный с правильными именами и типами столбцов, а также некоторыми ограничениями.
Немного длинное дело, попробуйте поработать с SET FMTONLY ON ( или выкл). Согласно BOL, это «возвращает клиенту только метаданные. Может использоваться для проверки формата ответа без фактического выполнения запроса». Я подозреваю, что это будет включать в себя то, что вы ищете, поскольку BCP использует это. (Я наткнулся на этот параметр при отладке некоторых очень странных проблем с BCP.)
Не могли бы вы добавить еще один select к своей процедуре?
Если да, вы могли бы сделать это с помощью функции sql_variant_property .
Declare @Param Int
Set @Param = 30
Select sql_variant_property(@Param, 'BaseType')
Select sql_variant_property(@Param, 'Precision')
Select sql_variant_property(@Param, 'Scale')
Я отправил это в на этот вопрос.
Я спрашиваю, как определить, что sql типы серверов (например, varchar (25), int ...) имеют то, что мне дали
Затем вы можете распечатать тип, точность (т.е. 25, если его VarChar (25)) и масштаб параметра.
Надеюсь, что это поможет ... : )
Если вы не ограничены T-SQL и, очевидно, не возражаете против запуска SP (поскольку SET FMTONLY ON
не совсем надежен), вы определенно CAN может вызывать SP, скажем, из C #, используя SqlDataReader
. Затем проверьте SqlDataReader
, чтобы получить столбцы и типы данных. У вас также может быть несколько наборов результатов, вы также можете легко перейти к следующему набору результатов из этой среды.