Most large-scale applications integrate remote services and/or transactional databases. Yet building software that efficiently invokes distributed service or accesses relational databases is still quite difficult. Existing approaches to these problems are based on the Remote Procedure Call (RPC), Object-Relational Mapping (ORM), Web Services (WS), and distributed objects. ORM tools generally support a form of query sublanguage for efficient object selection, but it is not well-integrated with the host language. Web Services may seems to be a step backwards, yet document-oriented services and REST are gaining popularity. The last 20 years have produced a long litany of technologies based on these concepts, including ODBC, CORBA, DCE, DCOM, RMI, DAO, OLEDB, SQLJ, JDBC, EJB, JDO, Hibernate, XML-RPC, WSDL, Axis and LINQ. While significant progress has been made, complex design patterns for service facades and/or bulk data transfers must be followed to optimize communication between client and server or client and database, leading to programs that are difficult to modify and maintain. I present a new unified approach to invocation of distributed services and data access, called Batch Services. Batch Services introduce a novel control flow construct that partitions a program block into remote and local computations, while efficiently managing the communication between them. Batch Services do not require proxies, an embedded query language, or construction/decoding of service requests. The end result is a natural unified interface to distributed services and data, which can be added to any programming language. While hiding most of the complexity of remote communication, Batch Services also provide performance guarantees in terms of the number of round trips required to perform a batch. In the context of database access, a single batch statement always generates a constant number of SQL queries, no matter how many nested loops are used.