Compartir vía


API de extensibilidad de Azure Data Studio

Importante

Azure Data Studio se retira el 28 de febrero de 2026. Se recomienda usar Visual Studio Code. Para más información sobre la migración a Visual Studio Code, visite ¿Qué sucede con Azure Data Studio?

Azure Data Studio proporciona una API que las extensiones pueden usar para interactuar con otros elementos de Azure Data Studio, como el Explorador de objetos. Estas API están disponibles en el archivo src/sql/azdata.d.ts y se describen a continuación.

Administración de conexiones

azdata.connection

Funciones de nivel superior para la administración de conexiones

  • getCurrentConnection(): Thenable<azdata.connection.Connection> Obtiene la conexión actual en función del editor activo o de la selección del Explorador de objetos.

  • getActiveConnections(): Thenable<azdata.connection.Connection[]> Obtiene una lista de todas las conexiones de usuario activas. Devuelve una lista vacía si no hay ninguna conexión de este tipo.

  • getCredentials(connectionId: string): Thenable<{ [name: string]: string }> Obtiene un diccionario que contiene las credenciales asociadas a una conexión. De lo contrario, estos se devolverían como parte del diccionario de opciones en un objeto data.connection.Connection, pero serían eliminados de ese objeto.

Conexión

  • options: { [name: string]: string } El diccionario de las opciones de conexión
  • providerName: string Nombre del proveedor de conexiones (por ejemplo, "MSSQL")
  • connectionId: string El identificador único para la conexión

Código de ejemplo

> let connection = azdata.connection.getCurrentConnection();
connection: {
    providerName: 'MSSQL',
    connectionId: 'd97bb63a-466e-4ef0-ab6f-00cd44721dcc',
    options: {
        server: 'mairvine-sql-server',
        user: 'sa',
        authenticationType: 'sqlLogin',
        ...
 },
    ...
}
> let credentials = azdata.connection.getCredentials(connection.connectionId);
credentials: {
    password: 'abc123'
}

Explorador de objetos

azdata.objectexplorer

Funciones de nivel superior para el Explorador de objetos

  • getNode(connectionId: string, nodePath?: string): Thenable<azdata.objectexplorer.ObjectExplorerNode> Obtiene un nodo del Explorador de objetos correspondiente a la conexión y ruta de acceso especificadas. Si no se especifica ninguna ruta de acceso, devuelve el nodo de nivel superior para la conexión especificada. Si no hay ningún nodo en la ruta de acceso especificada, devuelve undefined. Nota: El nodePath de un objeto se genera mediante el back-end del servicio de herramientas de SQL y es difícil de construir a mano. Las futuras mejoras de API permiten obtener nodos en función de los metadatos que proporcione sobre el nodo, como el nombre, el tipo y el esquema.

  • getActiveConnectionNodes(): Thenable<azdata.objectexplorer.ObjectExplorerNode> Obtiene todos los nodos de conexión del Explorador de objetos activos.

  • findNodes(connectionId: string, type: string, schema: string, name: string, database: string, parentObjectNames: string[]): Thenable<azdata.objectexplorer.ObjectExplorerNode[]> Busca todos los nodos del Explorador de objetos que coinciden con los metadatos especificados. Los argumentos schema, databasey parentObjectNames deben ser undefined cuando no sean aplicables. parentObjectNames es una lista de objetos primarios que no son de base de datos, del nivel más alto al más bajo en el Explorador de objetos, en el que se encuentra el objeto deseado. Por ejemplo, al buscar una columna "column1" que pertenezca a una tabla "schema1.table1" y la base de datos "database1" con el identificador de conexión connectionId, llame a findNodes(connectionId, 'Column', undefined, 'column1', 'database1', ['schema1.table1']). Consulte también la lista de tipos que Azure Data Studio admite de forma predeterminada para esta llamada API.

ObjectExplorerNode

  • connectionId: string El identificador de la conexión en la que existe el nodo

  • nodePath: string La ruta de acceso del nodo, tal y como se usa para una llamada a la función getNode

  • nodeType: string Una cadena que representa el tipo de nodo

  • nodeSubType: string Una cadena que representa el subtipo de nodo

  • nodeStatus: string Una cadena que representa el estado del nodo

  • label: string La etiqueta del nodo tal y como aparece en el Explorador de objetos

  • isLeaf: boolean Si el nodo es un nodo hoja y, por tanto, no tiene ningún elemento secundario

  • metadata: azdata.ObjectMetadata Metadatos que describen el objeto representado por este nodo

  • errorMessage: string Mensaje que se muestra si el nodo está en un estado de error

  • isExpanded(): Thenable<boolean> Si el nodo está expandido actualmente en el Explorador de objetos

  • setExpandedState(expandedState: vscode.TreeItemCollapsibleState): Thenable<void> Establece si el nodo está expandido o contraído. El nodo no se cambiará si el estado está establecido en Ninguno.

  • setSelected(selected: boolean, clearOtherSelections?: boolean): Thenable<void> Establece si el nodo está seleccionado. Si clearOtherSelections es true, borre las demás selecciones al crear la nueva selección. Si es falso, deje intactas las selecciones existentes. clearOtherSelections tiene como valor predeterminado true cuando selected es true y false cuando selected es false.

  • getChildren(): Thenable<azdata.objectexplorer.ObjectExplorerNode[]> Obtiene todos los nodos secundarios de este nodo. Devuelve una lista vacía si no hay elementos secundarios.

  • getParent(): Thenable<azdata.objectexplorer.ObjectExplorerNode> Obtiene el nodo primario de este nodo. Devuelve undefined si no hay ningún elemento primario.

Código de ejemplo

private async interactWithOENode(selectedNode: azdata.objectexplorer.ObjectExplorerNode): Promise<void> {
    let choices = ['Expand', 'Collapse', 'Select', 'Select (multi)', 'Deselect', 'Deselect (multi)'];
    if (selectedNode.isLeaf) {
 choices[0] += ' (is leaf)';
 choices[1] += ' (is leaf)';
 } else {
        let expanded = await selectedNode.isExpanded();
        if (expanded) {
 choices[0] += ' (is expanded)';
 } else {
 choices[1] += ' (is collapsed)';
 }
 }
    let parent = await selectedNode.getParent();
    if (parent) {
 choices.push('Get Parent');
 }
    let children = await selectedNode.getChildren();
 children.forEach(child => choices.push(child.label));
    let choice = await vscode.window.showQuickPick(choices);
 let nextNode: azdata.objectexplorer.ObjectExplorerNode = undefined;
    if (choice === choices[0]) {
 selectedNode.setExpandedState(vscode.TreeItemCollapsibleState.Expanded);
 } else if (choice === choices[1]) {
 selectedNode.setExpandedState(vscode.TreeItemCollapsibleState.Collapsed);
 } else if (choice === choices[2]) {
 selectedNode.setSelected(true);
 } else if (choice === choices[3]) {
 selectedNode.setSelected(true, false);
 } else if (choice === choices[4]) {
 selectedNode.setSelected(false);
 } else if (choice === choices[5]) {
 selectedNode.setSelected(false, true);
 } else if (choice === 'Get Parent') {
 nextNode = parent;
 } else {
        let childNode = children.find(child => child.label === choice);
 nextNode = childNode;
 }
    if (nextNode) {
        let updatedNode = await azdata.objectexplorer.getNode(nextNode.connectionId, nextNode.nodePath);
        this.interactWithOENode(updatedNode);
 }
}

vscode.commands.registerCommand('mssql.objectexplorer.interact', () => {
 azdata.objectexplorer.getActiveConnectionNodes().then(activeConnections => {
 vscode.window.showQuickPick(activeConnections.map(connection => connection.label + ' ' + connection.connectionId)).then(selection => {
            let selectedNode = activeConnections.find(connection => connection.label + ' ' + connection.connectionId === selection);
            this.interactWithOENode(selectedNode);
 });
 });
});

API propuestas

Hemos agregado API propuestas para permitir que las extensiones muestren la interfaz de usuario personalizada en los cuadros de diálogo, los asistentes y las pestañas de documentos, entre otras funcionalidades. Consulte el archivo de tipos de API propuestos para obtener más documentación, aunque tenga en cuenta que estas API están sujetas a cambios en cualquier momento. Puede encontrar ejemplos de cómo usar algunas de estas API en la extensión de ejemplo "subservicios" .