 				throw DatabaseError(message: "Error binding null to parameter \(idx)", takingDescriptionFromStatement: stmt)
 			}
 		}
+	}
+
+	/// Binds `value` to the SQL parameter `name`.
+	///
+	/// - parameter value: The desired value of the SQL parameter
+	/// - parameter name: The name of the SQL parameter to bind
+	///
+	/// - throws: An error if the SQL parameter `name` doesn't exist or `value` couldn't be bound
+	public func bind<T: ParameterBindable>(value: T, toParameter name: String) throws {
+		let idx = sqlite3_bind_parameter_index(stmt, name)
+		guard idx > 0 else {
+			throw DatabaseError("Unknown parameter \"\(name)\"")
+		}
+
+		try value.bind(to: stmt, parameter: idx)
 	}
 
 	/// Binds `value` to the SQL parameter `name`.

	/// - parameter block: A closure called for each result row
	///
	/// - 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, T: ParameterBindable>(sql: String, parameters values: S, _ block: ((_ row: Row) throws -> ())? = nil) throws where S.Iterator.Element == T? {
		let statement = try prepare(sql: sql)
		try statement.bind(parameters: values)
		try statement.execute(block)
	}


	/// - parameter values: A sequence of values to bind to SQL parameters
	///
	/// - throws: An error if one of `values` couldn't be bound
	public func bind<S: Sequence, T: ParameterBindable>(parameters values: S) throws where S.Iterator.Element == T {
		var index: Int32 = 1
		for value in values {
			try value.bind(to: stmt, parameter: index)
			index += 1
		}
	}

	/// Binds the *n* parameters in `values` to the first *n* SQL parameters of `self`.
	///
	/// - parameter values: A sequence of values to bind to SQL parameters
	///
	/// - throws: An error if one of `values` couldn't be bound
	public func bind<S: Sequence, T: ParameterBindable>(parameters values: S) throws where S.Iterator.Element == T? {
		var index: Int32 = 1
		for value in values {
