2009-06-19 8 views
2

J'essaie de créer un complément SSMS. Une des choses que je veux faire est de créer une nouvelle fenêtre de requête et de la connecter par programme à une instance de serveur (dans le contexte d'une connexion SQL). Je peux très bien créer la nouvelle fenêtre de script de requête, mais je ne trouve pas comment la connecter sans d'abord se connecter manuellement à autre chose (comme l'Explorateur d'objets).Comment connecter un nouveau script de requête avec le complément SSMS?

En d'autres termes, si je me connecte obect Explorer une instance SQL manuellement, puis exécutez la méthode de mon add-in qui crée la fenêtre de requête, je peux le connecter en utilisant ce code:

ServiceCache.ScriptFactory.CreateNewBlankScript(
    Editors.ScriptType.Sql, 
    ServiceCache.ScriptFactory.CurrentlyActiveWndConnectionInfo.UIConnectionInfo, 
    null); 

Mais Je ne veux pas compter sur CurrentlyActiveWndConnectionInfo.UIConnectionInfo pour la connexion. Je souhaite définir un nom d'utilisateur et un mot de passe SQL Login par programme.

Quelqu'un a-t-il des idées?

EDIT:

J'ai réussi à obtenir la fenêtre de requête connecté en définissant le dernier paramètre à une instance de System.Data.SqlClient.SqlConnection. Cependant, la connexion utilise le contexte de la dernière connexion qui a été connectée au lieu de ce que j'essaye de définir par programmation. C'est-à-dire, l'utilisateur qu'il connecte est celui qui est sélectionné dans la boîte de dialogue de connexion que vous obtenez lorsque vous cliquez sur le bouton Nouvelle requête et n'avez pas un Object Explorer connecté.

EDIT2:

J'écris (ou dans l'espoir d'écrire) un pour envoyer automatiquement ajouter dans une instruction SQL et les résultats d'exécution à notre système de suivi des dossiers lorsqu'il est exécuté sur nos serveurs de production. Une idée que j'ai eu était de supprimer les permissions d'écriture et d'assigner des connexions à travers ce complément qui forcera aussi l'utilisateur à entrer un cas # annulant l'instruction si elle n'est pas là. Une autre pensée que je viens de faire est d'inspecter le nom du serveur dans ServiceCache.ScriptFactory.CurrentlyActiveWndConnectionInfo.UIConnectionInfo et de le comparer à notre liste de serveurs de production. Si cela correspond et qu'il n'y a pas de cas, alors annulez la requête.

+0

vous essayez de créer votre propre connexion à la boîte de dialogue? –

+0

Oui, essentiellement. L'utilisateur n'entre pas les informations de connexion lui-même. Il sera récupéré du stockage persistant, que j'ai déjà travaillé. – squillman

+0

À un moment donné, j'avais entendu dire qu'il n'y avait aucun moyen de créer un complément pour SSMS. Est-ce que cela a changé? –

Répondre

1

Je n'ai pas trouvé un moyen de le faire, car il semble n'y avoir aucun moyen de se connecter à la fenêtre de dialogue de connexion.

sur quoi travaillez-vous?

EDIT: Si je comprends bien, vous voulez intercepter la requête en cours d'exécution et si elle correspond au serveur de production l'annuler sinon envoyer le texte et les résultats à un db? hmm ... alors que ce serait possible mais c'est une vraie douleur majeure dans le derrière, et je n'utiliserais pas un add-in pour ça. plus un complément peut être désactivé, désinstallé, etc vous feriez mieux d'essayer cela avec une configuration de sécurité appropriée sur votre serveur de production.

+0

Ooh, c'est un frein ... Vous êtes en fait l'une des personnes que j'espérais pouvoir m'aider après avoir trouvé votre site d'ajout la nuit dernière! J'ai édité la question pour inclure un résumé du projet. – squillman

+0

A votre montage: pas tout à fait. Je veux toujours que la requête passe par un système de production, je veux juste m'assurer que la requête et les résultats lancés contre nos serveurs de production soient envoyés à notre traqueur de problème. Je ne suis pas inquiet à propos de l'ajout d'un handicap, ce sera juste pour notre département. Cette solution serait une alternative SI je ne peux pas programmer quelqu'un dans ... – squillman

+0

Je suis désolé mais je ne vois pas vraiment un moyen viable pour vous de le faire. –

0

Je ne l'ai pas encore essayé mais je ne savais pas si vous l'avez essayé.

Microsoft.SqlServer.Management.Smo.RegSvrEnum.UIConnectionInfo u = 
    new Microsoft.SqlServer.Management.Smo.RegSvrEnum.UIConnectionInfo(); 

Doit vous permettre de faire votre propre connexion. Mais comme je l'ai dit, je ne l'ai pas encore testé. Vous aurez besoin d'une référence à Microsoft.SqlServer.RegSvrEnum.dll.

Faites-moi savoir si cela fonctionne.

2

Juste au cas où quelqu'un d'autre est à la recherche d'un moyen de créer et de connecter une fenêtre de requête programmaticaly - un court exemple pour SSMS 2012:

UIConnectionInfo u =new UIConnectionInfo(); 

u.ServerName = "TestPC\\ServerInstance"; 

u.ServerType = new Guid("8c91a03d-f9b4-46c0-a305-b5dcc79ff907"); 

u.AuthenticationType = 0;//Use AuthenticationType = 1 for SQL Server Authentication 

u.AdvancedOptions.Set("DATABASE", "AdventureWorks2012"); 

IScriptFactory scriptFactory = ServiceCache.ScriptFactory; 

if(scriptFactory != null) 
{ 
    scriptFactory.CreateNewBlankScript(ScriptType.Sql, u, null); 
} 

Cet extrait de code ouvrira une nouvelle fenêtre de requête connecté au serveur spécifié et base de données avec windows auth.