 	/// Executes `sql` with the *n* parameters in `values` bound to the first *n* SQL parameters of `sql` and applies `block` to each result row.
 	///
 	/// - parameter sql: The SQL statement to execute
-	/// - parameter values: A sequence of values to bind to SQL parameters
+	/// - parameter values: A collection of values to bind to SQL parameters
 	/// - parameter block: A closure called for each result row
 	/// - parameter row: A result row of returned data
 	///
 	/// - throws: Any error thrown in `block` or an error if `sql` couldn't be compiled, `values` couldn't be bound, or the statement couldn't be executed
-	public func execute<S: Sequence>(sql: String, parameterValues values: S, _ block: ((_ row: Row) throws -> ())? = nil) throws where S.Element: ParameterBindable {
+	public func execute<C: Collection>(sql: String, parameterValues values: C, _ block: ((_ row: Row) throws -> ())? = nil) throws where C.Element: ParameterBindable {
 		let statement = try prepare(sql: sql)
 		try statement.bind(parameterValues: values)
 		if let block = block {


	/// Binds *value* to SQL parameter *name* for each (*name*, *value*) in `parameters`.
	///
	/// - parameter parameters: A sequence of name and value pairs to bind to SQL parameters
	///
	/// - throws: An error if the SQL parameter *name* doesn't exist or *value* couldn't be bound
	///
	/// - returns: `self`
	@discardableResult public func bind<S: Sequence>(parameters: S) throws -> Statement where S.Element == (String, V: ParameterBindable) {
		for (name, value) in parameters {
			let index = sqlite3_bind_parameter_index(stmt, name)
			guard index > 0 else {


	/// Binds *value* to SQL parameter *name* for each (*name*, *value*) in `parameters`.
	///
	/// - parameter parameters: A series of name and value pairs to bind to SQL parameters
	///
	/// - throws: An error if the SQL parameter *name* doesn't exist or *value* couldn't be bound
	///
