VS2010数据库项目扩展

时间:2013-03-16 12:53:33

标签: c# visual-studio-2010 smo database-project vs-extensibility

我正在尝试为SQL Server数据库项目创建VS2010扩展(托管VSPackage)。

我想要做的是从Transact SQL编辑器窗口捕获“查询执行”事件:

enter image description here

然后捕获SQL文本并在执行之前对其进行修改。到目前为止,我的代码处理在打开文档时使用IVsRunningDocTableEvents接口连接Transact SQL编辑器窗口:

public int OnBeforeDocumentWindowShow(uint docCookie, int fFirstShow, IVsWindowFrame pFrame)
{
    try
    {
        var marshalingWindowFrame = pFrame as WindowFrame.MarshalingWindowFrame;
        if (marshalingWindowFrame != null)
        {
            var sqlScriptEditorControl =
                marshalingWindowFrame.ViewHelper as
                SqlScriptEditorControl;
            if (sqlScriptEditorControl != null)
            {
                if (!sqlScriptEditorControl.IsConnected)
                {
                    ReadConnectionInfoAndConnectEditor(sqlScriptEditorControl, docCookie);
                }
            }
        }
    }
    catch (Exception exception)
    {
        Debug.WriteLine(exception);
    }

    return VSConstants.S_OK;
}

private void ReadConnectionInfoAndConnectEditor(SqlScriptEditorControl sqlScriptEditorControl, uint docCookie)
{
    string documentName = GetDocumentMoniker(docCookie);

    var document = _dte.Documents.OfType<Document>().FirstOrDefault(x => x != null && x.FullName == documentName);
    if (document != null)
    {
        var p = document.ProjectItem.ContainingProject;
        var hierarchy = ProjectToHierarchy(p);

        var buildPropertyStorage = hierarchy as IVsBuildPropertyStorage;

        if (buildPropertyStorage != null)
        {
            string sandboxTargetConnectionString;
            buildPropertyStorage.GetPropertyValue("SandboxTargetConnectionString", "Debug", (uint)_PersistStorageType.PST_USER_FILE, out sandboxTargetConnectionString);

            string sandboxTargetDatabase;
            buildPropertyStorage.GetPropertyValue("SandboxTargetDatabase", "Debug", (uint)_PersistStorageType.PST_USER_FILE, out sandboxTargetDatabase);

            var connectionStringBuilder = new SqlConnectionStringBuilder
                {
                    ConnectionString = sandboxTargetConnectionString,
                    InitialCatalog = sandboxTargetDatabase,
                    ApplicationName = Assembly.GetExecutingAssembly().GetName().Name
                };

            var uiConnectionInfo = new UIConnectionInfo
                {
                    ServerName = connectionStringBuilder.DataSource,
                    ServerType = Microsoft.SqlServer.Management.UI.ConnectionDlg.SqlServerType.ServerType
                };

            var sqlConnection = new SqlConnection
                {
                    ConnectionString = connectionStringBuilder.ConnectionString
                };
            sqlConnection.Open();

            sqlScriptEditorControl.SetConnection(uiConnectionInfo, sqlConnection);
        }
    }
}

在这种情况下,如何订阅“查询执行”事件?

0 个答案:

没有答案