示例#1
0
        public void AddCe35Database(object sender, ExecutedRoutedEventArgs e)
        {
            // http://www.mztools.com/articles/2007/MZ2007011.aspx
            if (!Helpers.DataConnectionHelper.DDEXProviderIsInstalled(new Guid(Resources.SqlCompact35Provider)))
            {
                EnvDTEHelper.ShowError("The version 3.5 Visual Studio DDEX provider is not installed, cannot add connection");
                return;
            }
            try
            {
                var objIVsDataConnectionDialogFactory = package.GetServiceHelper(typeof(IVsDataConnectionDialogFactory)) as IVsDataConnectionDialogFactory;
                var objIVsDataConnectionDialog        = objIVsDataConnectionDialogFactory.CreateConnectionDialog();
                objIVsDataConnectionDialog.AddAllSources();
                objIVsDataConnectionDialog.SelectedSource   = new Guid("130BADA6-E128-423c-9D07-02E4734D45D4");
                objIVsDataConnectionDialog.SelectedProvider = new Guid(Resources.SqlCompact35Provider);

                if (objIVsDataConnectionDialog.ShowDialog() && objIVsDataConnectionDialog.SelectedProvider == new Guid(Resources.SqlCompact35Provider))
                {
                    Helpers.DataConnectionHelper.SaveDataConnection(package, objIVsDataConnectionDialog.EncryptedConnectionString, objIVsDataConnectionDialog.DisplayConnectionString, DatabaseType.SQLCE35, new Guid(Resources.SqlCompact35Provider));
                    ExplorerControl control = _parentWindow.Content as ExplorerControl;
                    control.BuildDatabaseTree();
                    Helpers.DataConnectionHelper.LogUsage("DatabasesAddCe35Database");
                }
                objIVsDataConnectionDialog.Dispose();
            }
            catch (Exception ex)
            {
                Helpers.DataConnectionHelper.SendError(ex, DatabaseType.SQLCE35);
            }
        }
        public void GenerateCeDgmlFiles(object sender, ExecutedRoutedEventArgs e)
        {
            var databaseInfo = ValidateMenuInfo(sender);

            if (databaseInfo == null)
            {
                return;
            }

            if (package == null)
            {
                return;
            }
            var dte = package.GetServiceHelper(typeof(DTE)) as DTE;

            var fd = new SaveFileDialog
            {
                Title           = "Save generated DGML file as",
                Filter          = "DGML (*.dgml)|*.dgml",
                OverwritePrompt = true,
                ValidateNames   = true
            };
            var result = fd.ShowDialog();

            if (!result.HasValue || result.Value != true)
            {
                return;
            }
            var fileName = fd.FileName;

            try
            {
                using (var repository = Helpers.RepositoryHelper.CreateRepository(databaseInfo.DatabaseInfo))
                {
                    var generator = DataConnectionHelper.CreateGenerator(repository, fileName, databaseInfo.DatabaseInfo.DatabaseType);
                    generator.GenerateSchemaGraph(databaseInfo.DatabaseInfo.Caption, Properties.Settings.Default.IncludeSystemTablesInDocumentation, false);
                    if (dte != null)
                    {
                        dte.ItemOperations.OpenFile(fileName);
                        dte.ActiveDocument.Activate();
                    }
                    DataConnectionHelper.LogUsage("DatabaseScriptDGML");
                }
            }
            catch (Exception ex)
            {
                DataConnectionHelper.SendError(ex, DatabaseType.SQLCE35, false);
            }
        }
        internal static void RemoveDataConnection(SqlCeToolboxPackage package, string connectionString, Guid provider)
        {
            var removals = new List <IVsDataExplorerConnection>();
            var dataExplorerConnectionManager = package.GetServiceHelper(typeof(IVsDataExplorerConnectionManager)) as IVsDataExplorerConnectionManager;

            foreach (var connection in dataExplorerConnectionManager.Connections.Values)
            {
                var objProviderGuid = connection.Provider;
                if ((objProviderGuid == new Guid(Resources.SqlCompact35Provider)) || (objProviderGuid == new Guid(Resources.SqlCompact40Provider)))
                {
                    if (Microsoft.VisualStudio.Data.Services.DataProtection.DecryptString(connection.EncryptedConnectionString) == connectionString)
                    {
                        removals.Add(connection);
                    }
                }
            }

            for (int i = removals.Count - 1; i >= 0; i--)
            {
                try
                {
                    dataExplorerConnectionManager.RemoveConnection(removals[i]);
                }
                catch (ArgumentException)
                {
                }
                catch (IndexOutOfRangeException)
                {
                }
            }
        }
 internal static void SaveDataConnection(SqlCeToolboxPackage package, string encryptedConnectionString,
                                         DatabaseType dbType, Guid provider)
 {
     if (package.GetServiceHelper(typeof(IVsDataExplorerConnectionManager)) is IVsDataExplorerConnectionManager dataExplorerConnectionManager)
     {
         var savedName = GetFileName(DataProtection.DecryptString(encryptedConnectionString), dbType);
         dataExplorerConnectionManager.AddConnection(savedName, provider, encryptedConnectionString, true);
     }
 }
示例#5
0
        internal void ScanConnections(SqlCeToolboxPackage package)
        {
            var          dte       = package.GetServiceHelper(typeof(DTE)) as DTE2;
            var          helper    = RepositoryHelper.CreateEngineHelper(DatabaseType.SQLCE40);
            EnvDteHelper dteHelper = new EnvDteHelper();
            var          list      = dteHelper.GetSqlCeFilesInActiveSolution(dte);

            foreach (var path in list)
            {
                if (File.Exists(path))
                {
                    bool         versionFound = false;
                    SQLCEVersion version      = SQLCEVersion.SQLCE20;
                    try
                    {
                        version      = helper.DetermineVersion(path);
                        versionFound = true;
                    }
                    catch
                    {
                        // ignored
                    }
                    string connectionString = string.Format("Data Source={0}", path);
                    if (versionFound)
                    {
                        if (version == SQLCEVersion.SQLCE35)
                        {
                            SaveDataConnection(connectionString, DatabaseType.SQLCE35, package);
                        }
                        else if (version == SQLCEVersion.SQLCE40)
                        {
                            SaveDataConnection(connectionString, DatabaseType.SQLCE40, package);
                        }
                    }
                    else
                    {
                        var dbInfo = new DatabaseInfo()
                        {
                            DatabaseType     = DatabaseType.SQLite,
                            ConnectionString = connectionString
                        };
                        try
                        {
                            using (var repo = Helpers.RepositoryHelper.CreateRepository(dbInfo))
                            {
                                repo.GetAllTableNames();
                            }
                            SaveDataConnection(connectionString, DatabaseType.SQLite, package);
                        }
                        catch
                        {
                            // ignored
                        }
                    }
                }
            }
        }
        internal static void SaveDataConnection(SqlCeToolboxPackage package, string connectionString, string testString, DatabaseType dbType, Guid provider, bool encryptedString = true)
        {
            var dataExplorerConnectionManager = package.GetServiceHelper(typeof(IVsDataExplorerConnectionManager)) as IVsDataExplorerConnectionManager;

            if (dataExplorerConnectionManager != null)
            {
                string savedName = GetFileName(testString, dbType);
                dataExplorerConnectionManager.AddConnection(savedName, provider, connectionString, encryptedString);
            }
        }
示例#7
0
        private bool TryGetInitialPath(SqlCeToolboxPackage package, out string path)
        {
            var          dte       = package.GetServiceHelper(typeof(EnvDTE.DTE)) as EnvDTE.DTE;
            EnvDTEHelper dteHelper = new EnvDTEHelper();

            try
            {
                path = dteHelper.GetInitialFolder(dte);
                return(true);
            }
            catch
            {
                path = null;
                return(false);
            }
        }
        void item_Click(object sender, EventArgs e)
        {
            try
            {
                var menuItem = BuildMenuItemForCommandHandler();

                if (menuItem == null)
                {
                    return;
                }

                var menuInfo = menuItem.CommandParameter as MenuCommandParameters;

                using (IRepository repository = new ServerDBRepository(menuInfo.DatabaseInfo.ConnectionString, true))
                {
                    var generator = DataConnectionHelper.CreateGenerator(repository, menuInfo.DatabaseInfo.DatabaseType);
                    generator.GenerateTableContent(menuItem.Tag as string, false, Properties.Settings.Default.IgnoreIdentityInInsertScript);
                    if (!Properties.Settings.Default.IgnoreIdentityInInsertScript)
                    {
                        generator.GenerateIdentityReset(menuItem.Tag as string, false);
                    }
                    ScriptFactory.Instance.CreateNewBlankScript(ScriptType.Sql);
                    var dte = _package.GetServiceHelper(typeof(DTE)) as DTE;
                    if (dte != null)
                    {
                        var doc = (TextDocument)dte.Application.ActiveDocument.Object(null);
                        doc.EndPoint.CreateEditPoint().Insert(generator.GeneratedScript);
                        doc.DTE.ActiveDocument.Saved = true;
                    }
                    DataConnectionHelper.LogUsage("TableScriptAsData");
                }
            }
            catch (Exception ex)
            {
                DataConnectionHelper.SendError(ex, DatabaseType.SQLServer, false);
            }
        }
        public void GenerateDataContextInProject(object sender, ExecutedRoutedEventArgs e)
        {
            var databaseInfo = ValidateMenuInfo(sender);

            if (databaseInfo == null)
            {
                return;
            }

            var isDesktop = (bool)((MenuItem)sender).Tag;

            if (package == null)
            {
                return;
            }
            var dte = package.GetServiceHelper(typeof(DTE)) as DTE;

            if (dte == null)
            {
                return;
            }
            if (dte.Mode == vsIDEMode.vsIDEModeDebug)
            {
                EnvDteHelper.ShowError("Cannot generate code while debugging");
                return;
            }

            var helper = Helpers.RepositoryHelper.CreateEngineHelper(databaseInfo.DatabaseInfo.DatabaseType);

            if (!helper.IsV35DbProviderInstalled())
            {
                EnvDteHelper.ShowError("This feature requires the SQL Server Compact 3.5 SP2 DbProvider to be properly installed");
                return;
            }

            var dteH = new EnvDteHelper();

            var project = dteH.GetProject(dte);

            if (project == null)
            {
                EnvDteHelper.ShowError("Please select a project in Solution Explorer, where you want the DataContext to be placed");
                return;
            }
            if (!isDesktop && !dteH.AllowedWpProjectKinds.Contains(new Guid(project.Kind)))
            {
                EnvDteHelper.ShowError("The selected project type does not support Windows Phone (please let me know if I am wrong)");
                return;
            }
            if (isDesktop && !dteH.AllowedProjectKinds.Contains(new Guid(project.Kind)))
            {
                EnvDteHelper.ShowError("The selected project type does not support LINQ to SQL (please let me know if I am wrong)");
                return;
            }
            if (project.Properties.Item("TargetFrameworkMoniker") == null)
            {
                EnvDteHelper.ShowError("The selected project type does not support Windows Phone - missing TargetFrameworkMoniker");
                return;
            }
            if (!isDesktop)
            {
                if (project.Properties.Item("TargetFrameworkMoniker").Value.ToString() == "Silverlight,Version=v4.0,Profile=WindowsPhone71" ||
                    project.Properties.Item("TargetFrameworkMoniker").Value.ToString() == "WindowsPhone,Version=v8.0" ||
                    project.Properties.Item("TargetFrameworkMoniker").Value.ToString() == "WindowsPhone,Version=v8.1"
                    )
                {
                }
                else
                {
                    EnvDteHelper.ShowError("The selected project type does not support Windows Phone 7.1/8.0 - wrong TargetFrameworkMoniker: " + project.Properties.Item("TargetFrameworkMoniker").Value);
                    return;
                }
            }
            if (isDesktop && !project.Properties.Item("TargetFrameworkMoniker").Value.ToString().Contains(".NETFramework"))
            {
                EnvDteHelper.ShowError("The selected project type does not support .NET Desktop - wrong TargetFrameworkMoniker: " + project.Properties.Item("TargetFrameworkMoniker").Value);
                return;
            }
            if (!isDesktop && databaseInfo.DatabaseInfo.DatabaseType != DatabaseType.SQLCE35)
            {
                EnvDteHelper.ShowError("Sorry, only version 3.5 databases are supported for now");
                return;
            }

            var sqlMetalPath = ProbeSqlMetalRegPaths();

            if (string.IsNullOrEmpty(sqlMetalPath))
            {
                EnvDteHelper.ShowError("Could not find SQLMetal file location");
                return;
            }

            var sdfFileName = string.Empty;

            try
            {
                using (var repository = Helpers.RepositoryHelper.CreateRepository(databaseInfo.DatabaseInfo))
                {
                    var tables        = repository.GetAllTableNames();
                    var pks           = repository.GetAllPrimaryKeys();
                    var checkedTables = string.Empty;
                    foreach (var tableName in tables)
                    {
                        var pk = pks.Where(k => k.TableName == tableName).FirstOrDefault();
                        if (pk.TableName == null)
                        {
                            checkedTables += tableName + Environment.NewLine;
                        }
                    }
                    if (!string.IsNullOrEmpty(checkedTables))
                    {
                        var message = string.Format("The tables below do not have Primary Keys defined,{0}and will not be generated properly:{1}{2}", Environment.NewLine, Environment.NewLine, checkedTables);
                        EnvDteHelper.ShowError(message);
                    }
                    var dbInfo = repository.GetDatabaseInfo();
                    foreach (var kvp in dbInfo)
                    {
                        if (kvp.Key == "Database")
                        {
                            sdfFileName = kvp.Value;
                            break;
                        }
                    }
                    sdfFileName = Path.GetFileName(sdfFileName);
                }

                var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(databaseInfo.DatabaseInfo.Caption);
                if (fileNameWithoutExtension != null)
                {
                    var model = fileNameWithoutExtension.Replace(" ", string.Empty).Replace("#", string.Empty).Replace(".", string.Empty).Replace("-", string.Empty);
                    model = model + "Context";
                    var dcDialog = new DataContextDialog();
                    dcDialog.ModelName   = model;
                    dcDialog.IsDesktop   = isDesktop;
                    dcDialog.ProjectName = project.Name;
                    dcDialog.NameSpace   = project.Properties.Item("DefaultNamespace").Value.ToString();
                    if (EnvDteHelper.VbProject == new Guid(project.Kind))
                    {
                        dcDialog.CodeLanguage = "VB";
                    }
                    else
                    {
                        dcDialog.CodeLanguage = "C#";
                    }
                    var result = dcDialog.ShowModal();
                    if (!result.HasValue || result.Value != true || string.IsNullOrWhiteSpace(dcDialog.ModelName))
                    {
                        return;
                    }
                    if (dcDialog.AddRowversionColumns)
                    {
                        AddRowVersionColumns(databaseInfo);
                    }

                    var sdfPath = databaseInfo.DatabaseInfo.ConnectionString;

                    //If version 4.0, create a 3.5 schema sdf, and use that as connection string
                    if (isDesktop && databaseInfo.DatabaseInfo.DatabaseType == DatabaseType.SQLCE40)
                    {
                        var tempFile = Path.GetTempFileName();
                        using (var repository = Helpers.RepositoryHelper.CreateRepository(databaseInfo.DatabaseInfo))
                        {
                            var generator = DataConnectionHelper.CreateGenerator(repository, tempFile, databaseInfo.DatabaseInfo.DatabaseType);
                            generator.ScriptDatabaseToFile(Scope.Schema);
                        }
                        if (sdfFileName != null)
                        {
                            sdfPath = Path.Combine(Path.GetTempPath(), sdfFileName);
                        }
                        using (Stream stream = new MemoryStream(Resources.SqlCe35AddinStore))
                        {
                            // Create a FileStream object to write a stream to a file
                            using (var fileStream = File.Create(sdfPath, (int)stream.Length))
                            {
                                // Fill the bytes[] array with the stream data
                                var bytesInStream = new byte[stream.Length];
                                stream.Read(bytesInStream, 0, bytesInStream.Length);
                                // Use FileStream object to write to the specified file
                                fileStream.Write(bytesInStream, 0, bytesInStream.Length);
                            }
                        }
                        var info = new DatabaseInfo
                        {
                            ConnectionString = "Data Source=" + sdfPath,
                            DatabaseType     = DatabaseType.SQLCE35
                        };
                        using (var repository = Helpers.RepositoryHelper.CreateRepository(info))
                        {
                            var script = File.ReadAllText(tempFile);
                            repository.ExecuteSql(script);
                        }
                        sdfPath = info.ConnectionString;
                    }

                    var versionNumber = GetVersionTableNumber(databaseInfo.DatabaseInfo, isDesktop);

                    model = dcDialog.ModelName;
                    var dcPath = Path.Combine(Path.GetTempPath(), model + ".cs");
                    if (dcDialog.CodeLanguage == "VB")
                    {
                        dcPath = Path.Combine(Path.GetTempPath(), model + ".vb");
                    }
                    var parameters = " /provider:SQLCompact /code:\"" + dcPath + "\"";
                    parameters += " /conn:\"" + sdfPath + "\"";
                    parameters += " /context:" + model;
                    if (dcDialog.Pluralize)
                    {
                        parameters += " /pluralize";
                    }
                    if (!string.IsNullOrWhiteSpace(dcDialog.NameSpace))
                    {
                        parameters += " /namespace:" + dcDialog.NameSpace;
                    }
                    var dcH = new DataContextHelper();

                    var sqlmetalResult = dcH.RunSqlMetal(sqlMetalPath, parameters);
                    if (!File.Exists(dcPath))
                    {
                        EnvDteHelper.ShowError("Error during SQL Metal run: " + sqlmetalResult);
                        return;
                    }

                    if (!isDesktop)
                    {
                        using (var repository = Helpers.RepositoryHelper.CreateRepository(databaseInfo.DatabaseInfo))
                        {
                            if (dcDialog.CodeLanguage == "VB")
                            {
                                DataContextHelper.FixDataContextVB(dcPath, model, dcDialog.NameSpace, sdfFileName, repository);
                            }
                            else
                            {
                                DataContextHelper.FixDataContextCS(dcPath, model, dcDialog.NameSpace, sdfFileName, repository);
                            }
                        }
                    }
                    if (dcDialog.MultipleFiles)
                    {
                        var classes     = DataContextHelper.SplitIntoMultipleFiles(dcPath, dcDialog.NameSpace, model);
                        var projectPath = project.Properties.Item("FullPath").Value.ToString();

                        foreach (var item in classes)
                        {
                            var fileName = Path.Combine(projectPath, item.Key + ".cs");
                            if (File.Exists(fileName))
                            {
                                File.Delete(fileName);
                            }
                            File.WriteAllText(fileName, item.Value);
                            var classItem = dteH.GetProjectDataContextClass(project, fileName);
                            if (classItem != null)
                            {
                                classItem.Delete();
                            }
                            project.ProjectItems.AddFromFile(fileName);
                        }
                    }
                    else
                    {
                        var extension = ".cs";
                        if (dcDialog.CodeLanguage == "VB")
                        {
                            extension = ".vb";
                        }
                        var dcItem = dteH.GetProjectDc(project, model, extension);
                        if (dcItem == null)
                        {
                            project.ProjectItems.AddFromFileCopy(dcPath);
                        }
                        else
                        {
                            if (EnvDteHelper.ShowMessageBox("The Data Context class already exists in the project, do you wish to replace it?", OLEMSGBUTTON.OLEMSGBUTTON_YESNO, OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_SECOND, OLEMSGICON.OLEMSGICON_QUERY) == System.Windows.Forms.DialogResult.Yes)
                            {
                                dcItem.Delete();
                                project.ProjectItems.AddFromFileCopy(dcPath);
                            }
                        }
                    }
                    EnvDteHelper.AddReference(project, "System.Data.Linq");
                    if (dcDialog.AddConnectionStringBuilder)
                    {
                        var projectPath = project.Properties.Item("FullPath").Value.ToString();

                        var fileName = "LocalDatabaseConnectionStringBuilder.cs";

                        var filePath = Path.Combine(projectPath, fileName);
                        if (File.Exists(filePath))
                        {
                            File.Delete(filePath);
                        }
                        using (Stream stream = new MemoryStream(Resources.LocalDatabaseConnectionStringBuilder))
                        {
                            // Create a FileStream object to write a stream to a file
                            using (var fileStream = File.Create(filePath, (int)stream.Length))
                            {
                                // Fill the bytes[] array with the stream data
                                var bytesInStream = new byte[stream.Length];
                                stream.Read(bytesInStream, 0, bytesInStream.Length);
                                // Use FileStream object to write to the specified file
                                fileStream.Write(bytesInStream, 0, bytesInStream.Length);
                            }
                        }
                        project.ProjectItems.AddFromFile(filePath);
                    }

                    // Creates __Version table and adds one row if desired
                    if (dcDialog.AddVersionTable)
                    {
                        using (var repository = Helpers.RepositoryHelper.CreateRepository(databaseInfo.DatabaseInfo))
                        {
                            var list = repository.GetAllTableNames();
                            if (!list.Contains("__VERSION"))
                            {
                                repository.ExecuteSql(string.Format(@"
                                CREATE TABLE [__VERSION] (
                                  [SchemaVersion] int NOT NULL
                                , [DateUpdated] datetime NOT NULL DEFAULT (GETDATE())
                                );
                                GO
                                CREATE INDEX [IX_SchemaVersion] ON [__VERSION] ([SchemaVersion] DESC);
                                GO
                                INSERT INTO [__VERSION] ([SchemaVersion]) VALUES ({0});
                                GO", versionNumber));
                            }
                        }
                    }
                    DataConnectionHelper.LogUsage("DatabaseCreateDC");
                }
            }
            catch (Exception ex)
            {
                DataConnectionHelper.SendError(ex, databaseInfo.DatabaseInfo.DatabaseType, false);
            }
        }
        internal static Dictionary <string, DatabaseInfo> GetDataConnections(SqlCeToolboxPackage package,
                                                                             bool includeServerConnections, bool serverConnectionsOnly)
        {
            // http://www.mztools.com/articles/2007/MZ2007018.aspx
            Dictionary <string, DatabaseInfo> databaseList = new Dictionary <string, DatabaseInfo>();
            var dataExplorerConnectionManager =
                package.GetServiceHelper(typeof(IVsDataExplorerConnectionManager)) as IVsDataExplorerConnectionManager;

            //Test code...

            //var objIVsDataProviderManager = package.GetServiceHelper(typeof(IVsDataProviderManager)) as IVsDataProviderManager;
            //var objIVsDataConnectionManager = package.GetServiceHelper(typeof(IVsDataConnectionManager)) as IVsDataConnectionManager;
            //var objIVsDataSourceManager = package.GetServiceHelper(typeof(IVsDataSourceManager)) as IVsDataSourceManager;

            //IVsDataProvider objIVsDataProvider;
            //foreach (var objIVsDataSource in objIVsDataSourceManager.Sources)
            //{
            //    //System.Diagnostics.Debug.WriteLine(objIVsDataSource.DisplayName);
            //    //System.Diagnostics.Debug.WriteLine(objIVsDataSource.Guid.ToString());

            //    //foreach (var objProviderGuid in objIVsDataSource.GetProviders())
            //    //{
            //    //    objIVsDataProvider = objIVsDataProviderManager.GetDataProvider(objProviderGuid);
            //    //    System.Diagnostics.Debug.WriteLine(objIVsDataProvider.DisplayName);
            //    //    System.Diagnostics.Debug.WriteLine(objIVsDataProvider.Guid.ToString());
            //    //}
            //}

            // End test code

            Guid provider35            = new Guid(Resources.SqlCompact35Provider);
            Guid provider40            = new Guid(Resources.SqlCompact40Provider);
            Guid provider40Private     = new Guid(Resources.SqlCompact40PrivateProvider);
            Guid providerSqLite        = new Guid(Resources.SQLiteProvider);
            Guid providerSqlitePrivate = new Guid(Resources.SqlitePrivateProvider);

            bool isV35Installed = RepositoryHelper.IsV35Installed() && DdexProviderIsInstalled(provider35);
            bool isV40Installed = RepositoryHelper.IsV40Installed() &&
                                  (DdexProviderIsInstalled(provider40) || DdexProviderIsInstalled(provider40Private));

            if (dataExplorerConnectionManager != null)
            {
                foreach (var connection in dataExplorerConnectionManager.Connections.Values)
                {
                    try
                    {
                        var objProviderGuid = connection.Provider;
                        if (!serverConnectionsOnly)
                        {
                            if ((objProviderGuid == provider35 && isV35Installed) ||
                                (objProviderGuid == provider40 && isV40Installed) ||
                                (objProviderGuid == provider40Private && isV40Installed))
                            {
                                DatabaseType dbType = DatabaseType.SQLCE40;
                                if (objProviderGuid == provider35)
                                {
                                    dbType = DatabaseType.SQLCE35;
                                }
                                var serverVersion = "4.0";
                                if (dbType == DatabaseType.SQLCE35)
                                {
                                    serverVersion = "3.5";
                                }

                                var sConnectionString =
                                    DataProtection.DecryptString(connection.EncryptedConnectionString);
                                if (!sConnectionString.Contains("Mobile Device"))
                                {
                                    DatabaseInfo info = new DatabaseInfo()
                                    {
                                        Caption            = connection.DisplayName,
                                        FromServerExplorer = true,
                                        DatabaseType       = dbType,
                                        ServerVersion      = serverVersion,
                                        ConnectionString   = sConnectionString
                                    };
                                    info.FileIsMissing = RepositoryHelper.IsMissing(info);
                                    if (!databaseList.ContainsKey(sConnectionString))
                                    {
                                        databaseList.Add(sConnectionString, info);
                                    }
                                }
                            }

                            if (objProviderGuid == providerSqLite ||
                                objProviderGuid == providerSqlitePrivate)
                            {
                                DatabaseType dbType = DatabaseType.SQLite;

                                var sConnectionString =
                                    DataProtection.DecryptString(connection.EncryptedConnectionString);
                                DatabaseInfo info = new DatabaseInfo()
                                {
                                    Caption            = connection.DisplayName,
                                    FromServerExplorer = true,
                                    DatabaseType       = dbType,
                                    ServerVersion      = RepositoryHelper.SqliteEngineVersion,
                                    ConnectionString   = sConnectionString
                                };
                                info.FileIsMissing = RepositoryHelper.IsMissing(info);
                                if (!databaseList.ContainsKey(sConnectionString))
                                {
                                    databaseList.Add(sConnectionString, info);
                                }
                            }
                        }
                        if (includeServerConnections && objProviderGuid == new Guid(Resources.SqlServerDotNetProvider))
                        {
                            var sConnectionString = DataProtection.DecryptString(connection.EncryptedConnectionString);
                            var info = new DatabaseInfo()
                            {
                                Caption            = connection.DisplayName,
                                FromServerExplorer = true,
                                DatabaseType       = DatabaseType.SQLServer,
                                ServerVersion      = string.Empty,
                                ConnectionString   = sConnectionString
                            };
                            if (!databaseList.ContainsKey(sConnectionString))
                            {
                                databaseList.Add(sConnectionString, info);
                            }
                        }
                    }
                    catch (KeyNotFoundException)
                    {
                    }
                    catch (NullReferenceException)
                    {
                    }
                    catch (ArgumentException)
                    {
                    }
                }
            }
#if SSMS
            try
            {
                if (package.TelemetryVersion().Major == 140 && Properties.Settings.Default.GetObjectExplorerDatabases)
                {
                    var objectExplorerManager = new ObjectExplorerManager(package);
                    var list = objectExplorerManager.GetAllServerUserDatabases();
                    foreach (var item in list)
                    {
                        if (!databaseList.ContainsKey(item.Key))
                        {
                            databaseList.Add(item.Key, item.Value);
                        }
                    }
                }
            }
            catch (MissingMethodException)
            {
            }
#endif
            return(databaseList);
        }
        internal void ValidateConnections(SqlCeToolboxPackage package)
        {
            var dataExplorerConnectionManager =
                package.GetServiceHelper(typeof(IVsDataExplorerConnectionManager)) as IVsDataExplorerConnectionManager;
            var removals = new List <IVsDataExplorerConnection>();

            if (dataExplorerConnectionManager != null)
            {
                foreach (var connection in dataExplorerConnectionManager.Connections.Values)
                {
                    try
                    {
                        var objProviderGuid = connection.Provider;
                        if (
                            (objProviderGuid == new Guid(Resources.SqlCompact35Provider) && RepositoryHelper.IsV35Installed()) ||
                            (objProviderGuid == new Guid(Resources.SqlCompact40Provider) && RepositoryHelper.IsV40Installed()) ||
                            (objProviderGuid == new Guid(Resources.SqlCompact40PrivateProvider) && RepositoryHelper.IsV40Installed() ||
                             (objProviderGuid == new Guid(Resources.SqlitePrivateProvider) && IsSqLiteDbProviderInstalled())
                            ))
                        {
                            connection.Connection.Open();
                            connection.Connection.Close();
                        }
                    }
                    catch (Exception ex)
                    {
                        if (ex.GetType() == typeof(SQLiteException))
                        {
                            removals.Add(connection);
                        }
                        if (ex.GetType().Name == "SqlCeException")
                        {
                            removals.Add(connection);
                        }
                        if (ex.GetType().Name == "SqlCeInvalidDatabaseFormatException")
                        {
                            removals.Add(connection);
                        }
                        if (ex.GetType() == typeof(ArgumentException))
                        {
                            removals.Add(connection);
                        }
                        if (ex.GetType() == typeof(KeyNotFoundException))
                        {
                            removals.Add(connection);
                        }
                        throw;
                    }
                }
                for (int i = removals.Count - 1; i >= 0; i--)
                {
                    try
                    {
                        dataExplorerConnectionManager.RemoveConnection(removals[i]);
                    }
                    catch (ArgumentException)
                    {
                    }
                    catch (IndexOutOfRangeException)
                    {
                    }
                    catch (KeyNotFoundException)
                    {
                    }
                }
            }

            var ownConnections = GetOwnDataConnections();

            foreach (var item in ownConnections)
            {
                try
                {
                    using (Helpers.RepositoryHelper.CreateRepository(item.Value))
                    {
                    }
                }
                catch (Exception ex)
                {
                    if (ex.GetType().Name == "SqlCeException" ||
                        ex.GetType().Name == "SqlCeInvalidDatabaseFormatException")
                    {
                        RemoveDataConnection(item.Value.ConnectionString);
                    }
                    throw;
                }
            }
        }
 internal void ScanConnections(SqlCeToolboxPackage package)
 {
     var dte = package.GetServiceHelper(typeof(EnvDTE.DTE)) as EnvDTE.DTE;
     var helper = Helpers.DataConnectionHelper.CreateEngineHelper(DatabaseType.SQLCE40);
     EnvDTEHelper dteHelper = new EnvDTEHelper();
     var list = dteHelper.GetSqlCeFilesInActiveSolution(dte);
     foreach (var path in list)
     {
         if (File.Exists(path))
         {
             bool versionFound = false;
             SQLCEVersion version = SQLCEVersion.SQLCE20;
             try
             {
                 version = helper.DetermineVersion(path);
                 versionFound = true;
             }
             catch {}
             string connectionString = string.Format("Data Source={0}", path);
             if (versionFound)
             {                        
                 if (version == SQLCEVersion.SQLCE35)
                 {
                     SaveDataConnection(connectionString, DatabaseType.SQLCE35, package);
                 }
                 else if (version == SQLCEVersion.SQLCE40)
                 {
                     SaveDataConnection(connectionString, DatabaseType.SQLCE40, package);
                 }
             }
             else
             { 
                 var dbInfo = new DatabaseInfo();
                 dbInfo.DatabaseType = DatabaseType.SQLite;
                 dbInfo.ConnectionString = connectionString;
                 try
                 {
                     using (var repo = CreateRepository(dbInfo))
                     {
                         repo.GetAllTableNames();
                     }
                     SaveDataConnection(connectionString, DatabaseType.SQLite, package);
                 }
                 catch { }
             }
         }
     }
 }
        internal static Dictionary<string, DatabaseInfo> GetDataConnections(SqlCeToolboxPackage package, bool includeServerConnections, bool serverConnectionsOnly)
        {
            // http://www.mztools.com/articles/2007/MZ2007018.aspx
            Dictionary<string, DatabaseInfo> databaseList = new Dictionary<string, DatabaseInfo>();
            var dataExplorerConnectionManager = package.GetServiceHelper(typeof(IVsDataExplorerConnectionManager)) as IVsDataExplorerConnectionManager;
            
            //Test code...

            //var objIVsDataProviderManager = package.GetServiceHelper(typeof(IVsDataProviderManager)) as IVsDataProviderManager;
            //var objIVsDataConnectionManager = package.GetServiceHelper(typeof(IVsDataConnectionManager)) as IVsDataConnectionManager;
            //var objIVsDataSourceManager = package.GetServiceHelper(typeof(IVsDataSourceManager)) as IVsDataSourceManager;

            //IVsDataProvider objIVsDataProvider;
            //foreach (var objIVsDataSource in objIVsDataSourceManager.Sources)
            //{
            //    //System.Diagnostics.Debug.WriteLine(objIVsDataSource.DisplayName);
            //    //System.Diagnostics.Debug.WriteLine(objIVsDataSource.Guid.ToString());

            //    //foreach (var objProviderGuid in objIVsDataSource.GetProviders())
            //    //{
            //    //    objIVsDataProvider = objIVsDataProviderManager.GetDataProvider(objProviderGuid);
            //    //    System.Diagnostics.Debug.WriteLine(objIVsDataProvider.DisplayName);
            //    //    System.Diagnostics.Debug.WriteLine(objIVsDataProvider.Guid.ToString());
            //    //}
            //}
            
            // End test code

            Guid provider35 = new Guid(Resources.SqlCompact35Provider);
            Guid provider40 = new Guid(Resources.SqlCompact40Provider);
            Guid providerSQLite = new Guid(Resources.SQLiteProvider);

            bool isV35Installed = IsV35Installed() && DDEXProviderIsInstalled(provider35);
            bool isV40Installed = IsV40Installed() && DDEXProviderIsInstalled(provider40);
            if (dataExplorerConnectionManager != null)
            {
                foreach (var connection in dataExplorerConnectionManager.Connections.Values)
                {
                    try
                    {
                        var objProviderGuid = connection.Provider;
                        if (!serverConnectionsOnly)
                        {
                            if ((objProviderGuid == provider35 && isV35Installed) || (objProviderGuid == provider40 && isV40Installed) )
                            {
                                DatabaseType dbType = DatabaseType.SQLCE40;
                                if (objProviderGuid == provider35)
                                    dbType = DatabaseType.SQLCE35;
                                var serverVersion = "4.0";
                                if (dbType == DatabaseType.SQLCE35)
                                    serverVersion = "3.5";

                                var sConnectionString = Microsoft.VisualStudio.Data.Services.DataProtection.DecryptString(connection.EncryptedConnectionString);
                                if (!sConnectionString.Contains("Mobile Device"))
                                {
                                    DatabaseInfo info = new DatabaseInfo();
                                    info.Caption = connection.DisplayName;
                                    info.FromServerExplorer = true;
                                    info.DatabaseType = dbType;
                                    info.ServerVersion = serverVersion;
                                    info.ConnectionString = sConnectionString;
                                    info.FileIsMissing = IsMissing(info);
                                    if (!databaseList.ContainsKey(sConnectionString))
                                        databaseList.Add(sConnectionString, info);
                                }
                            }

                            if (objProviderGuid == providerSQLite)
                            {
                                DatabaseType dbType = DatabaseType.SQLite;

                                var sConnectionString = Microsoft.VisualStudio.Data.Services.DataProtection.DecryptString(connection.EncryptedConnectionString);
                                DatabaseInfo info = new DatabaseInfo();
                                info.Caption = connection.DisplayName;
                                info.FromServerExplorer = true;
                                info.DatabaseType = dbType;
                                info.ServerVersion = "3.9";
                                info.ConnectionString = sConnectionString;
                                info.FileIsMissing = IsMissing(info);
                                if (!databaseList.ContainsKey(sConnectionString))
                                    databaseList.Add(sConnectionString, info);
                            }                            
                        }
                        if (includeServerConnections && objProviderGuid == new Guid(Resources.SqlServerDotNetProvider))
                        {
                            var sConnectionString = Microsoft.VisualStudio.Data.Services.DataProtection.DecryptString(connection.EncryptedConnectionString);
                            var info = new DatabaseInfo();
                            info.Caption = connection.DisplayName;
                            info.FromServerExplorer = true;
                            info.DatabaseType = DatabaseType.SQLServer;
                            info.ServerVersion = string.Empty;
                            info.ConnectionString = sConnectionString;
                            if (!databaseList.ContainsKey(sConnectionString))
                                databaseList.Add(sConnectionString, info);
                        }
                    }
                    catch (KeyNotFoundException)
                    {
                        continue;
                    }
                    catch (NullReferenceException)
                    {
                        continue;
                    }
                }
            }
            return databaseList;
        }
 internal static void SaveDataConnection(SqlCeToolboxPackage package, string connectionString, string testString, DatabaseType dbType, Guid provider, bool encryptedString = true)
 {
     var dataExplorerConnectionManager = package.GetServiceHelper(typeof(IVsDataExplorerConnectionManager)) as IVsDataExplorerConnectionManager;
     if (dataExplorerConnectionManager != null)
     {
         string savedName = GetFileName(testString, dbType);
         dataExplorerConnectionManager.AddConnection(savedName, provider, connectionString, encryptedString);
     }
 }
        public void GenerateServerDgmlFiles(object sender, ExecutedRoutedEventArgs e)
        {
            // http://www.mztools.com/articles/2007/MZ2007011.aspx
            var menuItem = sender as MenuItem;

            if (menuItem == null)
            {
                return;
            }

            var databaseInfo = menuItem.CommandParameter as DatabaseMenuCommandParameters;

            if (databaseInfo == null)
            {
                return;
            }

            var originalValue = Properties.Settings.Default.KeepSchemaNames;
            var dte           = _package.GetServiceHelper(typeof(DTE)) as DTE;

            try
            {
                var connectionString = databaseInfo.DatabaseInfo != null
                    ? databaseInfo.DatabaseInfo.ConnectionString :
                                       DataConnectionHelper.PromptForConnectionString(_package);

                if (string.IsNullOrEmpty(connectionString))
                {
                    return;
                }
                var ptd = new PickTablesDialog();
                using (var repository = Helpers.RepositoryHelper.CreateRepository(new DatabaseInfo {
                    ConnectionString = connectionString, DatabaseType = DatabaseType.SQLServer
                }))
                {
                    ptd.Tables = repository.GetAllTableNamesForExclusion();
                }

                var res = ptd.ShowModal();

                if (res.HasValue && res.Value)
                {
                    var fd = new SaveFileDialog();
                    fd.Title           = "Save generated DGML file as";
                    fd.Filter          = "DGML (*.dgml)|*.dgml";
                    fd.OverwritePrompt = true;
                    fd.ValidateNames   = true;
                    var result = fd.ShowDialog();
                    if (!result.HasValue || result.Value != true)
                    {
                        return;
                    }
                    Properties.Settings.Default.KeepSchemaNames = true;
                    var fileName = fd.FileName;
                    using (var repository = Helpers.RepositoryHelper.CreateRepository(new DatabaseInfo {
                        ConnectionString = connectionString, DatabaseType = DatabaseType.SQLServer
                    }))
                    {
                        try
                        {
                            var generator = DataConnectionHelper.CreateGenerator(repository, fileName, DatabaseType.SQLServer);
                            generator.GenerateSchemaGraph(connectionString, ptd.Tables);
                            if (dte != null)
                            {
                                dte.ItemOperations.OpenFile(fileName);
                                dte.ActiveDocument.Activate();
                            }
                            DataConnectionHelper.LogUsage("DatabasesScriptDGML");
                        }
                        catch (Exception ex)
                        {
                            DataConnectionHelper.SendError(ex, DatabaseType.SQLServer, false);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                DataConnectionHelper.SendError(ex, DatabaseType.SQLServer, false);
            }
            finally
            {
                Properties.Settings.Default.KeepSchemaNames = originalValue;
            }
        }
示例#16
0
        public async void GenerateEfPocoFromDacPacInProject(object sender, ExecutedRoutedEventArgs e)
        {
            EnvDteHelper.LaunchUrl("https://github.com/sjh37/EntityFramework-Reverse-POCO-Code-First-Generator");

            var databaseInfo = ValidateMenuInfo(sender);

            if (databaseInfo == null)
            {
                return;
            }

            var isEf6 = SqlCeToolboxPackage.VsSupportsEf6();

            try
            {
                var dte = _package?.GetServiceHelper(typeof(DTE)) as DTE;
                if (dte == null)
                {
                    return;
                }
                if (dte.Mode == vsIDEMode.vsIDEModeDebug)
                {
                    EnvDteHelper.ShowError("Cannot generate code while debugging");
                    return;
                }

                var dteH = new EnvDteHelper();

                var project = dteH.GetProject(dte);
                if (project == null)
                {
                    EnvDteHelper.ShowError("Please select a project in Solution Explorer, where you want the generated code to be placed");
                    return;
                }
                if (dte.Solution.SolutionBuild.BuildState == vsBuildState.vsBuildStateNotStarted)
                {
                    EnvDteHelper.ShowError("Please build the project before proceeding");
                    return;
                }
                if (isEf6)
                {
                    if (!dteH.ContainsEf6Reference(project))
                    {
                        EnvDteHelper.ShowError("Please add the EntityFramework 6.x NuGet package to the project");
                        return;
                    }
                }
                if (!dteH.AllowedProjectKinds.Contains(new Guid(project.Kind)))
                {
                    EnvDteHelper.ShowError("The selected project type does not support Entity Framework (please let me know if I am wrong)");
                    return;
                }

                if (project.Properties.Item("TargetFrameworkMoniker") == null)
                {
                    EnvDteHelper.ShowError("The selected project type does not have a TargetFrameworkMoniker");
                    return;
                }
                if (!project.Properties.Item("TargetFrameworkMoniker").Value.ToString().Contains(".NETFramework"))
                {
                    EnvDteHelper.ShowError("The selected project type does not support .NET Desktop - wrong TargetFrameworkMoniker: " + project.Properties.Item("TargetFrameworkMoniker").Value);
                    return;
                }

                var ofd = new OpenFileDialog
                {
                    Filter          = "Dacpac (*.dacpac)|*.dacpac|All Files(*.*)|*.*",
                    CheckFileExists = true,
                    Multiselect     = false,
                    ValidateNames   = true
                };
                if (ofd.ShowDialog() != true)
                {
                    return;
                }

                var dacPacFileName = ofd.FileName;

                var connectionStringBuilder = new SqlConnectionStringBuilder
                {
                    DataSource         = @"(localdb)\mssqllocaldb",
                    InitialCatalog     = Path.GetFileNameWithoutExtension(dacPacFileName),
                    IntegratedSecurity = true
                };

                var dacFxHelper = new DacFxHelper(_package);
                await dacFxHelper.RunDacPackageAsync(connectionStringBuilder, dacPacFileName);

                var prefix     = "App";
                var configPath = Path.Combine(Path.GetTempPath(), prefix + ".config");

                var item = dteH.GetProjectConfig(project);
                if (item == null)
                {
                    //Add app.config file to project
                    var cfgSb = new StringBuilder();
                    cfgSb.AppendLine("<?xml version=\"1.0\" encoding=\"utf-8\" ?>");
                    cfgSb.AppendLine("<configuration>");
                    cfgSb.AppendLine("</configuration>");
                    File.WriteAllText(configPath, cfgSb.ToString(), Encoding.UTF8);
                    item = project.ProjectItems.AddFromFileCopy(configPath);
                }
                if (item != null)
                {
                    AppConfigHelper.WriteConnectionStringToAppConfig("MyDbContext", connectionStringBuilder.ConnectionString, project.FullName, "System.Data.SqlClient", prefix, item.Name);
                }

                var dte2 = (DTE2)_package.GetServiceHelper(typeof(DTE));
                // ReSharper disable once SuspiciousTypeConversion.Global
                var solution2 = dte2.Solution as Solution2;

                var projectItemTemplate = solution2?.GetProjectItemTemplate("EntityFramework Reverse POCO Code First Generator", "CSharp");
                if (!string.IsNullOrEmpty(projectItemTemplate))
                {
                    var projectItem = dteH.GetProjectDataContextClass(project, "Database.tt".ToLowerInvariant());
                    if (projectItem == null)
                    {
                        project.ProjectItems.AddFromTemplate(projectItemTemplate, "Database.tt");
                        EnvDteHelper.ShowMessage("Please run Custom Tool with the Database.tt file");
                    }
                    else
                    {
                        EnvDteHelper.ShowMessage("Database.tt already exists, please run Custom Tool with existing Database.tt file");
                    }
                }
                DataConnectionHelper.LogUsage("DatabaseCreateEFPOCODacpac");
            }
            catch (Exception ex)
            {
                if (ex.GetType() == typeof(FileNotFoundException))
                {
                    EnvDteHelper.ShowMessage("Unable to find the EF Reverse POCO Template, is it installed?");
                }
                else
                {
                    DataConnectionHelper.SendError(ex, databaseInfo.DatabaseInfo.DatabaseType, false);
                }
            }
        }
示例#17
0
        public void GenerateEfCoreModelInProject(object sender, ExecutedRoutedEventArgs e)
        {
            var databaseInfo = ValidateMenuInfo(sender);

            if (databaseInfo == null)
            {
                return;
            }

            var dbType = databaseInfo.DatabaseInfo.DatabaseType;

            var dte = package?.GetServiceHelper(typeof(DTE)) as DTE;

            if (dte == null)
            {
                return;
            }
            if (dte.Mode == vsIDEMode.vsIDEModeDebug)
            {
                EnvDteHelper.ShowError("Cannot generate code while debugging");
                return;
            }

            var dteH    = new EnvDteHelper();
            var project = dteH.GetProject(dte);

            if (project == null)
            {
                EnvDteHelper.ShowError("Please select a project in Solution Explorer, where you want the EF Core Model to be placed");
                return;
            }

            try
            {
                var ptd = new PickTablesDialog {
                    IncludeTables = true
                };
                using (var repository = DataConnectionHelper.CreateRepository(new DatabaseInfo {
                    ConnectionString = databaseInfo.DatabaseInfo.ConnectionString, DatabaseType = databaseInfo.DatabaseInfo.DatabaseType
                }))
                {
                    ptd.Tables = repository.GetAllTableNamesForExclusion();
                }
                var res = ptd.ShowModal();
                if (!res.HasValue || !res.Value)
                {
                    return;
                }

                var revEng = new EFCoreReverseEngineer.EfCoreReverseEngineer();

                var classBasis = Path.GetFileNameWithoutExtension(databaseInfo.DatabaseInfo.Caption);
                if (dbType == DatabaseType.SQLServer)
                {
                    classBasis = new SqlConnectionStringBuilder(databaseInfo.DatabaseInfo.ConnectionString).InitialCatalog;
                }

                var model = revEng.GenerateClassName(classBasis) + "Context";

                var modelDialog = new EfCoreModelDialog
                {
                    ModelName   = model,
                    ProjectName = project.Name,
                    NameSpace   = project.Properties.Item("DefaultNamespace").Value.ToString()
                };
                var result = modelDialog.ShowModal();
                if (!result.HasValue || result.Value != true)
                {
                    return;
                }

                var projectPath = project.Properties.Item("FullPath").Value.ToString();

                var options = new ReverseEngineerOptions
                {
                    UseFluentApiOnly     = !modelDialog.UseDataAnnotations,
                    ConnectionString     = databaseInfo.DatabaseInfo.ConnectionString,
                    ContextClassName     = modelDialog.ModelName,
                    DatabaseType         = (EFCoreReverseEngineer.DatabaseType)dbType,
                    ProjectPath          = projectPath,
                    OutputPath           = modelDialog.OutputPath,
                    ProjectRootNamespace = modelDialog.NameSpace,
                    Tables = ptd.Tables
                };

                var revEngResult = revEng.GenerateFiles(options);

                foreach (var filePath in revEngResult.FilePaths)
                {
                    project.ProjectItems.AddFromFile(filePath);
                }
                if (revEngResult.FilePaths.Count > 0)
                {
                    dte.ItemOperations.OpenFile(revEngResult.FilePaths.Last());
                }

                ReportRevEngErrors(revEngResult, dteH.ContainsEfCoreReference(project, dbType));

                DataConnectionHelper.LogUsage("DatabaseCreateEfCoreModel");
            }
            catch (Exception ex)
            {
                DataConnectionHelper.SendError(ex, databaseInfo.DatabaseInfo.DatabaseType, false);
            }
        }
 private bool TryGetInitialPath(SqlCeToolboxPackage package, out string path)
 {
     var dte = package.GetServiceHelper(typeof(EnvDTE.DTE)) as EnvDTE.DTE;
     EnvDTEHelper dteHelper = new EnvDTEHelper();
     try
     {
         path = dteHelper.GetInitialFolder(dte);
         return true;
     }
     catch
     {
         path = null;
         return false;
     }
 }
        internal static Dictionary<string, DatabaseInfo> GetDataConnections(SqlCeToolboxPackage package,
            bool includeServerConnections, bool serverConnectionsOnly)
        {
            // http://www.mztools.com/articles/2007/MZ2007018.aspx
            Dictionary<string, DatabaseInfo> databaseList = new Dictionary<string, DatabaseInfo>();
            var dataExplorerConnectionManager =
                package.GetServiceHelper(typeof(IVsDataExplorerConnectionManager)) as IVsDataExplorerConnectionManager;

            //Test code...

            //var objIVsDataProviderManager = package.GetServiceHelper(typeof(IVsDataProviderManager)) as IVsDataProviderManager;
            //var objIVsDataConnectionManager = package.GetServiceHelper(typeof(IVsDataConnectionManager)) as IVsDataConnectionManager;
            //var objIVsDataSourceManager = package.GetServiceHelper(typeof(IVsDataSourceManager)) as IVsDataSourceManager;

            //IVsDataProvider objIVsDataProvider;
            //foreach (var objIVsDataSource in objIVsDataSourceManager.Sources)
            //{
            //    //System.Diagnostics.Debug.WriteLine(objIVsDataSource.DisplayName);
            //    //System.Diagnostics.Debug.WriteLine(objIVsDataSource.Guid.ToString());

            //    //foreach (var objProviderGuid in objIVsDataSource.GetProviders())
            //    //{
            //    //    objIVsDataProvider = objIVsDataProviderManager.GetDataProvider(objProviderGuid);
            //    //    System.Diagnostics.Debug.WriteLine(objIVsDataProvider.DisplayName);
            //    //    System.Diagnostics.Debug.WriteLine(objIVsDataProvider.Guid.ToString());
            //    //}
            //}

            // End test code

            Guid provider35 = new Guid(Resources.SqlCompact35Provider);
            Guid provider40 = new Guid(Resources.SqlCompact40Provider);
            Guid providerSqLite = new Guid(Resources.SQLiteProvider);

            bool isV35Installed = IsV35Installed() && DdexProviderIsInstalled(provider35);
            bool isV40Installed = IsV40Installed() && DdexProviderIsInstalled(provider40);
            if (dataExplorerConnectionManager != null)
            {
                foreach (var connection in dataExplorerConnectionManager.Connections.Values)
                {
                    try
                    {
                        var objProviderGuid = connection.Provider;
                        if (!serverConnectionsOnly)
                        {
                            if ((objProviderGuid == provider35 && isV35Installed) ||
                                (objProviderGuid == provider40 && isV40Installed))
                            {
                                DatabaseType dbType = DatabaseType.SQLCE40;
                                if (objProviderGuid == provider35)
                                    dbType = DatabaseType.SQLCE35;
                                var serverVersion = "4.0";
                                if (dbType == DatabaseType.SQLCE35)
                                    serverVersion = "3.5";

                                var sConnectionString =
                                    DataProtection.DecryptString(connection.EncryptedConnectionString);
                                if (!sConnectionString.Contains("Mobile Device"))
                                {
                                    DatabaseInfo info = new DatabaseInfo();
                                    info.Caption = connection.DisplayName;
                                    info.FromServerExplorer = true;
                                    info.DatabaseType = dbType;
                                    info.ServerVersion = serverVersion;
                                    info.ConnectionString = sConnectionString;
                                    info.FileIsMissing = IsMissing(info);
                                    if (!databaseList.ContainsKey(sConnectionString))
                                        databaseList.Add(sConnectionString, info);
                                }
                            }

                            if (objProviderGuid == providerSqLite)
                            {
                                DatabaseType dbType = DatabaseType.SQLite;

                                var sConnectionString =
                                    DataProtection.DecryptString(connection.EncryptedConnectionString);
                                DatabaseInfo info = new DatabaseInfo();
                                info.Caption = connection.DisplayName;
                                info.FromServerExplorer = true;
                                info.DatabaseType = dbType;
                                //TODO Update this when SQLite provider is updated!
                                info.ServerVersion = "3.15";
                                info.ConnectionString = sConnectionString;
                                info.FileIsMissing = IsMissing(info);
                                if (!databaseList.ContainsKey(sConnectionString))
                                    databaseList.Add(sConnectionString, info);
                            }
                        }
                        if (includeServerConnections && objProviderGuid == new Guid(Resources.SqlServerDotNetProvider))
                        {
                            var sConnectionString = DataProtection.DecryptString(connection.EncryptedConnectionString);
                            var info = new DatabaseInfo();
                            info.Caption = connection.DisplayName;
                            info.FromServerExplorer = true;
                            info.DatabaseType = DatabaseType.SQLServer;
                            info.ServerVersion = string.Empty;
                            info.ConnectionString = sConnectionString;
                            if (!databaseList.ContainsKey(sConnectionString))
                                databaseList.Add(sConnectionString, info);
                        }
                    }
                    catch (KeyNotFoundException)
                    {
                    }
                    catch (NullReferenceException)
                    {
                    }
                }
            }
#if SSMS
            try
            {
                var objectExplorerManager = new ObjectExplorerManager(package);
                var list = objectExplorerManager.GetAllServerUserDatabases();
                foreach (var item in list)
                {
                    if (!databaseList.ContainsKey(item.Key))
                        databaseList.Add(item.Key, item.Value);
                }
            }
            //TODO Make SSMS 14.x (17) work with above method!
            catch (MissingMethodException)
            {
            }
#endif
            return databaseList;
        }
        internal static void RemoveDataConnection(SqlCeToolboxPackage package, string connectionString, Guid provider)
        {
            var removals = new List<IVsDataExplorerConnection>();
            var dataExplorerConnectionManager = package.GetServiceHelper(typeof(IVsDataExplorerConnectionManager)) as IVsDataExplorerConnectionManager;
            foreach  (var connection in dataExplorerConnectionManager.Connections.Values)
            {
                var objProviderGuid = connection.Provider;
                if ((objProviderGuid == new Guid(Resources.SqlCompact35Provider)) || (objProviderGuid == new Guid(Resources.SqlCompact40Provider)))
                {
                    if (Microsoft.VisualStudio.Data.Services.DataProtection.DecryptString(connection.EncryptedConnectionString) == connectionString)
                    {
                        removals.Add(connection);
                    }
                }
            }

            for (int i = removals.Count - 1; i >= 0; i--)
            {
                try
                {
                    dataExplorerConnectionManager.RemoveConnection(removals[i]);
                }
                catch (ArgumentException)
                {
                }
                catch (IndexOutOfRangeException)
                {
                }
            }
        }
 private IObjectExplorerService GetObjectExplorer()
 {
     return(_package.GetServiceHelper(typeof(IObjectExplorerService)) as IObjectExplorerService);
 }
        internal static Dictionary <string, DatabaseInfo> GetDataConnections(SqlCeToolboxPackage package, bool includeServerConnections, bool serverConnectionsOnly)
        {
            // http://www.mztools.com/articles/2007/MZ2007018.aspx
            Dictionary <string, DatabaseInfo> databaseList = new Dictionary <string, DatabaseInfo>();
            var dataExplorerConnectionManager = package.GetServiceHelper(typeof(IVsDataExplorerConnectionManager)) as IVsDataExplorerConnectionManager;

            //Test code...

            //var objIVsDataProviderManager = package.GetServiceHelper(typeof(IVsDataProviderManager)) as IVsDataProviderManager;
            //var objIVsDataConnectionManager = package.GetServiceHelper(typeof(IVsDataConnectionManager)) as IVsDataConnectionManager;
            //var objIVsDataSourceManager = package.GetServiceHelper(typeof(IVsDataSourceManager)) as IVsDataSourceManager;

            //IVsDataProvider objIVsDataProvider;
            //foreach (var objIVsDataSource in objIVsDataSourceManager.Sources)
            //{
            //    //System.Diagnostics.Debug.WriteLine(objIVsDataSource.DisplayName);
            //    //System.Diagnostics.Debug.WriteLine(objIVsDataSource.Guid.ToString());

            //    //foreach (var objProviderGuid in objIVsDataSource.GetProviders())
            //    //{
            //    //    objIVsDataProvider = objIVsDataProviderManager.GetDataProvider(objProviderGuid);
            //    //    System.Diagnostics.Debug.WriteLine(objIVsDataProvider.DisplayName);
            //    //    System.Diagnostics.Debug.WriteLine(objIVsDataProvider.Guid.ToString());
            //    //}
            //}

            // End test code

            Guid provider35     = new Guid(Resources.SqlCompact35Provider);
            Guid provider40     = new Guid(Resources.SqlCompact40Provider);
            Guid providerSQLite = new Guid(Resources.SQLiteProvider);

            bool isV35Installed = IsV35Installed() && DDEXProviderIsInstalled(provider35);
            bool isV40Installed = IsV40Installed() && DDEXProviderIsInstalled(provider40);

            if (dataExplorerConnectionManager != null)
            {
                foreach (var connection in dataExplorerConnectionManager.Connections.Values)
                {
                    try
                    {
                        var objProviderGuid = connection.Provider;
                        if (!serverConnectionsOnly)
                        {
                            if ((objProviderGuid == provider35 && isV35Installed) || (objProviderGuid == provider40 && isV40Installed))
                            {
                                DatabaseType dbType = DatabaseType.SQLCE40;
                                if (objProviderGuid == provider35)
                                {
                                    dbType = DatabaseType.SQLCE35;
                                }
                                var serverVersion = "4.0";
                                if (dbType == DatabaseType.SQLCE35)
                                {
                                    serverVersion = "3.5";
                                }

                                var sConnectionString = Microsoft.VisualStudio.Data.Services.DataProtection.DecryptString(connection.EncryptedConnectionString);
                                if (!sConnectionString.Contains("Mobile Device"))
                                {
                                    DatabaseInfo info = new DatabaseInfo();
                                    info.Caption            = connection.DisplayName;
                                    info.FromServerExplorer = true;
                                    info.DatabaseType       = dbType;
                                    info.ServerVersion      = serverVersion;
                                    info.ConnectionString   = sConnectionString;
                                    info.FileIsMissing      = IsMissing(info);
                                    if (!databaseList.ContainsKey(sConnectionString))
                                    {
                                        databaseList.Add(sConnectionString, info);
                                    }
                                }
                            }

                            if (objProviderGuid == providerSQLite)
                            {
                                DatabaseType dbType = DatabaseType.SQLite;

                                var          sConnectionString = Microsoft.VisualStudio.Data.Services.DataProtection.DecryptString(connection.EncryptedConnectionString);
                                DatabaseInfo info = new DatabaseInfo();
                                info.Caption            = connection.DisplayName;
                                info.FromServerExplorer = true;
                                info.DatabaseType       = dbType;
                                info.ServerVersion      = "3.9";
                                info.ConnectionString   = sConnectionString;
                                info.FileIsMissing      = IsMissing(info);
                                if (!databaseList.ContainsKey(sConnectionString))
                                {
                                    databaseList.Add(sConnectionString, info);
                                }
                            }
                        }
                        if (includeServerConnections && objProviderGuid == new Guid(Resources.SqlServerDotNetProvider))
                        {
                            var sConnectionString = Microsoft.VisualStudio.Data.Services.DataProtection.DecryptString(connection.EncryptedConnectionString);
                            var info = new DatabaseInfo();
                            info.Caption            = connection.DisplayName;
                            info.FromServerExplorer = true;
                            info.DatabaseType       = DatabaseType.SQLServer;
                            info.ServerVersion      = string.Empty;
                            info.ConnectionString   = sConnectionString;
                            if (!databaseList.ContainsKey(sConnectionString))
                            {
                                databaseList.Add(sConnectionString, info);
                            }
                        }
                    }
                    catch (KeyNotFoundException)
                    {
                        continue;
                    }
                    catch (NullReferenceException)
                    {
                        continue;
                    }
                }
            }
            return(databaseList);
        }
        public async void GenerateEfCoreModelInProject(object sender, ExecutedRoutedEventArgs e)
        {
            var databaseInfo = ValidateMenuInfo(sender);

            if (databaseInfo == null)
            {
                return;
            }

            var dbType = databaseInfo.DatabaseInfo.DatabaseType;

            var dte = package?.GetServiceHelper(typeof(DTE)) as DTE;

            if (dte == null)
            {
                return;
            }
            if (dte.Mode == vsIDEMode.vsIDEModeDebug)
            {
                EnvDteHelper.ShowError("Cannot generate code while debugging");
                return;
            }

            var dteH    = new EnvDteHelper();
            var project = dteH.GetProject(dte);

            if (project == null)
            {
                EnvDteHelper.ShowError("Please select a project in Solution Explorer, where you want the EF Core Model to be placed");
                return;
            }

            try
            {
                var ptd = new PickTablesDialog {
                    IncludeTables = true
                };
                using (var repository = Helpers.RepositoryHelper.CreateRepository(new DatabaseInfo {
                    ConnectionString = databaseInfo.DatabaseInfo.ConnectionString, DatabaseType = databaseInfo.DatabaseInfo.DatabaseType
                }))
                {
                    ptd.Tables = repository.GetAllTableNamesForExclusion();
                }

                var res = ptd.ShowModal();
                if (!res.HasValue || !res.Value)
                {
                    return;
                }

                var revEng = new EfCoreReverseEngineer();

                var classBasis = Helpers.RepositoryHelper.GetClassBasis(databaseInfo.DatabaseInfo.ConnectionString, dbType);

                var model         = revEng.GenerateClassName(classBasis) + "Context";
                var packageResult = dteH.ContainsEfCoreReference(project, dbType);

                var modelDialog = new EfCoreModelDialog
                {
                    InstallNuGetPackage = !packageResult.Item1,
                    ModelName           = model,
                    ProjectName         = project.Name,
                    NameSpace           = project.Properties.Item("DefaultNamespace").Value.ToString()
                };
                var result = modelDialog.ShowModal();
                if (!result.HasValue || result.Value != true)
                {
                    return;
                }

                var projectPath = project.Properties.Item("FullPath").Value.ToString();

                var options = new ReverseEngineerOptions
                {
                    UseFluentApiOnly     = !modelDialog.UseDataAnnotations,
                    ConnectionString     = databaseInfo.DatabaseInfo.ConnectionString,
                    ContextClassName     = modelDialog.ModelName,
                    DatabaseType         = (EFCoreReverseEngineer.DatabaseType)dbType,
                    ProjectPath          = projectPath,
                    OutputPath           = modelDialog.OutputPath,
                    ProjectRootNamespace = modelDialog.NameSpace,
                    Tables = ptd.Tables
                };

                var revEngResult = revEng.GenerateFiles(options);

                if (modelDialog.SelectedTobeGenerated == 0 || modelDialog.SelectedTobeGenerated == 2)
                {
                    foreach (var filePath in revEngResult.EntityTypeFilePaths)
                    {
                        project.ProjectItems.AddFromFile(filePath);
                    }
                }
                if (modelDialog.SelectedTobeGenerated == 0 || modelDialog.SelectedTobeGenerated == 1)
                {
                    project.ProjectItems.AddFromFile(revEngResult.ContextFilePath);
                    dte.ItemOperations.OpenFile(revEngResult.ContextFilePath);
                }

                packageResult = dteH.ContainsEfCoreReference(project, dbType);

                var missingProviderPackage = packageResult.Item1 ? null : packageResult.Item2;
                if (modelDialog.InstallNuGetPackage)
                {
                    missingProviderPackage = null;
                }

                ReportRevEngErrors(revEngResult, missingProviderPackage);

                if (modelDialog.InstallNuGetPackage)
                {
                    package.SetStatus("Installing EF Core provider package");
                    var nuGetHelper = new NuGetHelper();
                    await nuGetHelper.InstallPackageAsync(packageResult.Item2, project);
                }

                DataConnectionHelper.LogUsage("DatabaseCreateEfCoreModel");
            }
            catch (Exception ex)
            {
                package.SetStatus(null);
                DataConnectionHelper.SendError(ex, databaseInfo.DatabaseInfo.DatabaseType, false);
            }
        }
        internal void ValidateConnections(SqlCeToolboxPackage package)
        {
            var dataExplorerConnectionManager = package.GetServiceHelper(typeof(IVsDataExplorerConnectionManager)) as IVsDataExplorerConnectionManager;
            var removals = new List<IVsDataExplorerConnection>();

            foreach (var connection in dataExplorerConnectionManager.Connections.Values)
            {
                try
                {
                    var objProviderGuid = connection.Provider;
                    if ((objProviderGuid == new Guid (Resources.SqlCompact35Provider) && IsV35Installed()) || (objProviderGuid == new Guid (Resources.SqlCompact40Provider) && IsV40Installed()))
                    {
                        connection.Connection.Open();
                        connection.Connection.Close();
                    }
                }
                catch (Exception ex)
                {
                    if (ex.GetType().Name == "SqlCeException")
                    {
                        removals.Add(connection);
                    }
                    if (ex.GetType() == typeof(ArgumentException))
                    {
                        removals.Add(connection);
                    }
                    if (ex.GetType() == typeof(KeyNotFoundException))
                    {
                        removals.Add(connection);
                    }
                    throw;
                }

            }
            for (int i = removals.Count - 1; i >= 0; i--)
            {
                try
                {
                    dataExplorerConnectionManager.RemoveConnection(removals[i]);
                }
                catch (ArgumentException)
                {
                }
                catch (IndexOutOfRangeException)
                {
                }
                catch (KeyNotFoundException)
                {
                }
            }

            var ownConnections = GetOwnDataConnections();
            foreach (var item in ownConnections)
            {
                try
                {
                    using (var test = CreateRepository(item.Value))
                    { }
                }
                catch (Exception ex)
                {
                    if (ex.GetType().Name == "SqlCeException")
                    {
                        System.Diagnostics.Debug.WriteLine(ex.Message);
                        RemoveDataConnection(item.Value.ConnectionString);
                    }
                    throw;
                }
            }
        }