Our framework uses a combination of code generation on the front end to build native drivers for different driver/adapter technologies, allowing it to support multiple technologies consistently and easily add new ones in the future. The data access chain is a key component of this architecture, consisting of objects that implement core driver functionality through an interface called IDataAccess. This layer handles services such as opening and closing transport connections, metadata queries, query execution, and more. To simplify the implementation of OAuth protocol for authentication, we use an IDataAccess implementation that takes care of obtaining or refreshing OAuth tokens before commands get to the driver. The framework also includes a function and alias resolution component that transforms SQL query AST to make it simpler for the driver to interpret, and a client-side query engine that evaluates queries on providers with limited query capabilities. The goal is to push down as much computation as possible while providing flexible query capabilities to meet customer needs. Result sets are represented as objects implementing the IResultSet interface, which includes obtaining metadata about result set columns, iterating over results, and obtaining values from columns for the current row. Provider implementations can be created using a new, driver-specific IDataAccess implementation or by reusing an existing generic framework that hooks into an existing generic IDataAccess implementation. The Query Evaluation and Query Slicer components are present in all providers, either as provider-specific implementations or by reusing base implementations in our framework.