diff --git a/BidsHelper2016.pkgdef.bak b/BidsHelper2016.pkgdef.bak new file mode 100644 index 0000000..133a8b6 Binary files /dev/null and b/BidsHelper2016.pkgdef.bak differ diff --git a/BidsHelperPackage.cs b/BidsHelperPackage.cs index e57236b..97247b6 100644 --- a/BidsHelperPackage.cs +++ b/BidsHelperPackage.cs @@ -85,6 +85,7 @@ public BIDSHelperPackage() /// protected override void Initialize() { + bool bQuitting = false; base.Initialize(); #if DEBUG @@ -105,6 +106,13 @@ protected override void Initialize() DebuggerService.AdviseDebuggerEvents(this, out debugEventCookie); + if (SwitchVsixManifest()) + { + bQuitting = true; + RestartVisualStudio(); + return; + } + foreach (Type t in Assembly.GetExecutingAssembly().GetTypes()) { if (//typeof(IBIDSHelperPlugin).IsAssignableFrom(t.GetType()) @@ -157,7 +165,120 @@ protected override void Initialize() } finally { - StatusBar.Clear(); + if (!bQuitting) + StatusBar.Clear(); + } + + } + + private bool SwitchVsixManifest() + { +#if SQL2017 + string sVersion = VersionInfo.SqlServerVersion.ToString(); + if (sVersion.StartsWith("13.")) //this DLL is for SQL 2017 but you have SSDT for SQL2016 installed + { + string sFolder = System.IO.Directory.GetParent(Assembly.GetExecutingAssembly().Location).FullName; + string sManifestPath = sFolder + "\\extension.vsixmanifest"; + string sBackupManifestPath = sFolder + "\\extension2017.vsixmanifest"; + string sOtherManifestPath = sFolder + "\\extension2016.vsixmanifest"; + + string sPkgdef2017Path = sFolder + "\\BidsHelper2017.pkgdef"; + string sPkgdef2017BackupPath = sFolder + "\\BidsHelper2017.pkgdef.bak"; + string sPkgdef2016Path = sFolder + "\\BidsHelper2016.pkgdef"; + string sPkgdef2016BackupPath = sFolder + "\\BidsHelper2016.pkgdef.bak"; + + if (System.IO.File.Exists(sOtherManifestPath) && System.IO.File.Exists(sPkgdef2016BackupPath) && System.IO.File.Exists(sPkgdef2017Path)) + { + //backup the current SQL2017 manifest + System.IO.File.Copy(sManifestPath, sBackupManifestPath, true); + + //copy SQL2016 manifest over the current manifest + System.IO.File.Copy(sOtherManifestPath, sManifestPath, true); + + if (System.IO.File.Exists(sPkgdef2016Path)) + System.IO.File.Delete(sPkgdef2016BackupPath); + else + System.IO.File.Move(sPkgdef2016BackupPath, sPkgdef2016Path); + + if (System.IO.File.Exists(sPkgdef2017BackupPath)) + System.IO.File.Delete(sPkgdef2017Path); + else + System.IO.File.Move(sPkgdef2017Path, sPkgdef2017BackupPath); + + System.Windows.Forms.MessageBox.Show("You have SSDT for SQL Server " + VersionInfo.SqlServerFriendlyVersion + " installed. Please restart Visual Studio so BIDS Helper can reconfigure itself to work properly with that version of SSDT.", "BIDS Helper"); + return true; + } + else + { + throw new Exception("You have SSDT for SQL Server " + VersionInfo.SqlServerFriendlyVersion + " installed but we couldn't find BIDS Helper 2016 files!"); + } + } +#elif SQL2016 + string sVersion = VersionInfo.SqlServerVersion.ToString(); + if (sVersion.StartsWith("14.")) //this DLL is for SQL 2016 but you have SSDT for SQL2017 installed + { + string sFolder = System.IO.Directory.GetParent(System.IO.Directory.GetParent(Assembly.GetExecutingAssembly().Location).FullName).FullName; + string sManifestPath = sFolder + "\\extension.vsixmanifest"; + string sBackupManifestPath = sFolder + "\\extension2016.vsixmanifest"; + string sOtherManifestPath = sFolder + "\\extension2017.vsixmanifest"; + + string sPkgdef2017Path = sFolder + "\\BidsHelper2017.pkgdef"; + string sPkgdef2017BackupPath = sFolder + "\\BidsHelper2017.pkgdef.bak"; + string sPkgdef2016Path = sFolder + "\\BidsHelper2016.pkgdef"; + string sPkgdef2016BackupPath = sFolder + "\\BidsHelper2016.pkgdef.bak"; + + if (System.IO.File.Exists(sOtherManifestPath) && System.IO.File.Exists(sPkgdef2017BackupPath) && System.IO.File.Exists(sPkgdef2016Path)) + { + //backup the current SQL2016 manifest + System.IO.File.Copy(sManifestPath, sBackupManifestPath, true); + + //copy SQL2017 manifest over the current manifest + System.IO.File.Copy(sOtherManifestPath, sManifestPath, true); + + if (System.IO.File.Exists(sPkgdef2017Path)) + System.IO.File.Delete(sPkgdef2017BackupPath); + else + System.IO.File.Move(sPkgdef2017BackupPath, sPkgdef2017Path); + + if (System.IO.File.Exists(sPkgdef2016BackupPath)) + System.IO.File.Delete(sPkgdef2016Path); + else + System.IO.File.Move(sPkgdef2016Path, sPkgdef2016BackupPath); + + System.Windows.Forms.MessageBox.Show("You have SSDT for SQL Server " + VersionInfo.SqlServerFriendlyVersion + " installed. Please restart Visual Studio so BIDS Helper can reconfigure itself to work properly with that version of SSDT.", "BIDS Helper"); + return true; + } + else + { + throw new Exception("You have SSDT for SQL Server " + VersionInfo.SqlServerFriendlyVersion + " installed but we couldn't find BIDS Helper 2017 files!"); + } + } +#endif + return false; + + } + + private void RestartVisualStudio() + { + System.Diagnostics.Process currentProcess = System.Diagnostics.Process.GetCurrentProcess(); + System.Diagnostics.Process newProcess = new System.Diagnostics.Process(); + newProcess.StartInfo = new System.Diagnostics.ProcessStartInfo { + FileName = currentProcess.MainModule.FileName, + ErrorDialog = true, + UseShellExecute = true, + Arguments = DTE2.CommandLineArguments + }; + newProcess.Start(); + + EnvDTE.Command command = DTE2.Commands.Item("File.Exit", -1); + + if ((command != null) && command.IsAvailable) + { + DTE2.ExecuteCommand("File.Exit", ""); + } + else + { + DTE2.Quit(); } } diff --git a/Core/Options/BIDSHelperOptionsVersion.cs b/Core/Options/BIDSHelperOptionsVersion.cs index 023ec4b..636742d 100644 --- a/Core/Options/BIDSHelperOptionsVersion.cs +++ b/Core/Options/BIDSHelperOptionsVersion.cs @@ -13,11 +13,11 @@ namespace BIDSHelper.Core { [ClassInterface(ClassInterfaceType.AutoDual)] [CLSCompliant(false), ComVisible(true)] - //[Guid(BIDSHelperOptionsVersion.OptionsGuidString)] + [Guid(BIDSHelperOptionsVersion.VersionGuidString)] public class BIDSHelperOptionsVersion: DialogPage { - // public const string OptionsGuidString = "9EBCE16B-26C2-4A22-A409-9752750A16AE"; - + public const string VersionGuidString = "9128d0ed-abbe-3002-9aee-4c06babd03ae"; + protected override IWin32Window Window { get diff --git a/Core/VersionInfo.cs b/Core/VersionInfo.cs index 9e2b151..cef3f55 100644 --- a/Core/VersionInfo.cs +++ b/Core/VersionInfo.cs @@ -127,6 +127,8 @@ public static string SqlServerFriendlyVersion return "2014"; else if (sVersion.StartsWith("13.")) return "2016"; + else if (sVersion.StartsWith("14.")) + return "2017"; else return string.Format("(SQL Unknown {0})", sVersion); } diff --git a/Manifest/SQL2017/VSPackage.resx b/Manifest/SQL2017/VSPackage.resx new file mode 100644 index 0000000..e5def2f --- /dev/null +++ b/Manifest/SQL2017/VSPackage.resx @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + BIDS Helper 2017 Extension + + + BIDS Helper 2017 Visual Studio Extension v2.0.1 - An add-in to extend SQL Server Data Tools + + + + ..\..\Resources\BidsHelper.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\..\Resources\deploymdxscript.xslt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + + ..\..\helpabouttext.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + + \ No newline at end of file diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index f3de503..70f2381 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -18,7 +18,9 @@ [assembly: CLSCompliant(false)] [assembly: NeutralResourcesLanguage("en-US")] -#if SQL2016 +#if SQL2017 +[assembly: AssemblyTitle("BIDS Helper for SQL Server 2017")] +#elif SQL2016 [assembly: AssemblyTitle("BIDS Helper for SQL Server 2016")] #elif SQL2014 [assembly: AssemblyTitle("BIDS Helper for SQL Server 2014")] diff --git a/SQL2016_BidsHelper.csproj b/SQL2016_BidsHelper.csproj index 407812f..a397d5f 100644 --- a/SQL2016_BidsHelper.csproj +++ b/SQL2016_BidsHelper.csproj @@ -49,11 +49,11 @@ AnyCPU 2.0 {82b43b9b-a64c-4715-b499-d71e9ca2bd60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - {0828F434-598D-4E5B-983A-9FAD3BFDE857} + {4EA3FC6B-F3D9-467E-92EA-68AC4C574CB3} Library Properties BIDSHelper - BidsHelper + BidsHelper2016 v4.6.1 true true diff --git a/SQL2017_BidsHelper.sln b/SQL2017_BidsHelper.sln new file mode 100644 index 0000000..fdab6e1 --- /dev/null +++ b/SQL2017_BidsHelper.sln @@ -0,0 +1,48 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SQL2017_BidsHelper", "SQL2017_BidsHelper.csproj", "{0828F434-598D-4E5B-983A-9FAD3BFDE857}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SQL2016_BidsHelper", "SQL2016_BidsHelper.csproj", "{4EA3FC6B-F3D9-467E-92EA-68AC4C574CB3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0828F434-598D-4E5B-983A-9FAD3BFDE857}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0828F434-598D-4E5B-983A-9FAD3BFDE857}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0828F434-598D-4E5B-983A-9FAD3BFDE857}.Debug|x86.ActiveCfg = Debug|x86 + {0828F434-598D-4E5B-983A-9FAD3BFDE857}.Debug|x86.Build.0 = Debug|x86 + {0828F434-598D-4E5B-983A-9FAD3BFDE857}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0828F434-598D-4E5B-983A-9FAD3BFDE857}.Release|Any CPU.Build.0 = Release|Any CPU + {0828F434-598D-4E5B-983A-9FAD3BFDE857}.Release|x86.ActiveCfg = Release|x86 + {0828F434-598D-4E5B-983A-9FAD3BFDE857}.Release|x86.Build.0 = Release|x86 + {4EA3FC6B-F3D9-467E-92EA-68AC4C574CB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4EA3FC6B-F3D9-467E-92EA-68AC4C574CB3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4EA3FC6B-F3D9-467E-92EA-68AC4C574CB3}.Debug|x86.ActiveCfg = Debug|x86 + {4EA3FC6B-F3D9-467E-92EA-68AC4C574CB3}.Debug|x86.Build.0 = Debug|x86 + {4EA3FC6B-F3D9-467E-92EA-68AC4C574CB3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4EA3FC6B-F3D9-467E-92EA-68AC4C574CB3}.Release|Any CPU.Build.0 = Release|Any CPU + {4EA3FC6B-F3D9-467E-92EA-68AC4C574CB3}.Release|x86.ActiveCfg = Release|x86 + {4EA3FC6B-F3D9-467E-92EA-68AC4C574CB3}.Release|x86.Build.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(TeamFoundationVersionControl) = preSolution + SccNumberOfProjects = 3 + SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C} + SccTeamFoundationServer = https://tfs.codeplex.com/tfs/tfs01 + SccProjectUniqueName0 = SQL2017_BidsHelper.csproj + SccLocalPath0 = . + SccProjectUniqueName1 = SQL2016_BidsHelper.csproj + SccLocalPath1 = . + SccLocalPath2 = . + EndGlobalSection +EndGlobal diff --git a/SSAS/DeploymentSettings.cs b/SSAS/DeploymentSettings.cs index 3a2c925..e154fc1 100644 --- a/SSAS/DeploymentSettings.cs +++ b/SSAS/DeploymentSettings.cs @@ -92,7 +92,7 @@ public string TargetCubeName private void SetDefaultTargetServer() { Microsoft.Win32.RegistryKey regKey; -#if SQL2016 +#if SQL2016 || SQL2017 regKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\VisualStudio\14.0\Packages\{4a0c6509-bf90-43da-abee-0aba3a8527f1}\Settings\Analysis Services Project"); #elif SQL2014 regKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\VisualStudio\12.0\Packages\{4a0c6509-bf90-43da-abee-0aba3a8527f1}\Settings\Analysis Services Project"); diff --git a/SSIS/DeployPackagesPlugin.cs b/SSIS/DeployPackagesPlugin.cs index 0fb0fbe..ec91d18 100644 --- a/SSIS/DeployPackagesPlugin.cs +++ b/SSIS/DeployPackagesPlugin.cs @@ -285,6 +285,10 @@ private void DeployProject(Project proj, IOutputWindow outputWindow, System.Arra process.StartInfo.CreateNoWindow = true; process.StartInfo.FileName = SSIS.PerformanceVisualization.PerformanceTab.GetPathToDtsExecutable("dtutil.exe", false); //makes the bat file less portable, but does workaround the problem if SSIS2005 and SSIS2008 are both installed... issue 21074 + if (string.IsNullOrEmpty(process.StartInfo.FileName)) + throw new Exception("Can't find path to dtutil in registry! Please make sure you have the SSIS service installed from the " + PackageHelper.TargetServerVersion.ToString() + " install media"); + + if (newOptions.DeploymentType != DtsProjectExtendedConfigurationOptions.DeploymentTypes.FilePathDestination) { //create the directories diff --git a/SSIS/PackageHelper.cs b/SSIS/PackageHelper.cs index fb7b72f..da230c1 100644 --- a/SSIS/PackageHelper.cs +++ b/SSIS/PackageHelper.cs @@ -38,8 +38,11 @@ internal class PackageHelper /// All managed components in the data flow share the same wrapper, identified by this GUID. /// The specific type of managed component is identified by the UserComponentTypeName custom property of the component. /// The GUID is documented in the class Syntax section - https://technet.microsoft.com/en-gb/library/microsoft.sqlserver.dts.pipeline.wrapper.cmanagedcomponentwrapperclass(v=sql.105).aspx + /// With newer versions, disassemble Microsoft.SqlServer.DTSPipelineWrap to find the GUID attribute on Microsoft.SqlServer.Dts.Pipeline.Wrapper.CManagedComponentWrapperClass /// -#if SQL2016 +#if SQL2017 + public const string ManagedComponentWrapper = "{8DC69D45-2AD5-40C6-AAEC-25722F92D6FC}"; +#elif SQL2016 public const string ManagedComponentWrapper = "{4F885D04-B578-47B7-94A0-DE9C7DA25EE2}"; #elif SQL2014 public const string ManagedComponentWrapper = "{33D831DE-5DCF-48F0-B431-4D327B9E785D}"; diff --git a/SSIS/PerformanceVisualization/DtsPipelineTestDirector.cs b/SSIS/PerformanceVisualization/DtsPipelineTestDirector.cs index 969eca9..f8c57d8 100644 --- a/SSIS/PerformanceVisualization/DtsPipelineTestDirector.cs +++ b/SSIS/PerformanceVisualization/DtsPipelineTestDirector.cs @@ -750,7 +750,7 @@ private static void HookupRowCountTransform(TaskHost dataFlowTask, MainPipe pipe Variable variable = dataFlowTask.Variables.Add("BIDS_HELPER_ROWCOUNT_" + output.ID, false, "User", (int)0); IDTSComponentMetaDataXX transform = pipeline.ComponentMetaDataCollection.New(); -#if SQL2016 +#if SQL2016 || SQL2017 transform.ComponentClassID = "Microsoft.RowCount"; #else transform.ComponentClassID = "DTSAdapter.RowCount"; @@ -771,7 +771,7 @@ private static void HookupRowCountTransform(TaskHost dataFlowTask, MainPipe pipe private void HookupRawDestination(MainPipe pipeline, IDTSOutputXX output) { IDTSComponentMetaDataXX rawDestComponent = pipeline.ComponentMetaDataCollection.New(); -#if SQL2016 +#if SQL2016 || SQL2017 rawDestComponent.ComponentClassID = "Microsoft.RawDestination"; #else rawDestComponent.ComponentClassID = "DTSAdapter.RawDestination"; @@ -793,7 +793,7 @@ private void HookupRawDestination(MainPipe pipeline, IDTSOutputXX output) private static void HookupRawSource(MainPipe pipeline, MainPipe pipelineToReference, IDTSInputXX input, IDTSComponentMetaDataXX componentNextInPath, string sRawFilePath) { IDTSComponentMetaDataXX rawSourceComponent = pipeline.ComponentMetaDataCollection.New(); -#if SQL2016 +#if SQL2016 || SQL2017 rawSourceComponent.ComponentClassID = "Microsoft.RawSource"; #else rawSourceComponent.ComponentClassID = "DTSAdapter.RawSource"; diff --git a/SSIS/PerformanceVisualization/PerformanceTab.cs b/SSIS/PerformanceVisualization/PerformanceTab.cs index b953178..a17e927 100644 --- a/SSIS/PerformanceVisualization/PerformanceTab.cs +++ b/SSIS/PerformanceVisualization/PerformanceTab.cs @@ -68,6 +68,8 @@ private static string DtsPathRegistryPath return @"SOFTWARE\Microsoft\Microsoft SQL Server\120\SSIS\Setup\DTSPath"; case SsisTargetServerVersion.SQLServer2016: return @"SOFTWARE\Microsoft\Microsoft SQL Server\130\SSIS\Setup\DTSPath"; + case SsisTargetServerVersion.SQLServer2017: + return @"SOFTWARE\Microsoft\Microsoft SQL Server\140\SSIS\Setup\DTSPath"; default: throw new Exception("Unknown deployment version, DTSPATH_REGISTRY_PATH cannot be determined."); } @@ -477,7 +479,7 @@ private void RefreshProjectAndPackageProperties() if (this.dtexecPath == null && this.use64Bit) this.dtexecPath = GetPathToDtsExecutable("dtexec.exe", false); if (this.dtexecPath == null) - throw new Exception("Can't find path to dtexec in registry!"); + throw new Exception("Can't find path to dtexec in registry! Please make sure you have the SSIS service installed from the " + PackageHelper.TargetServerVersion.ToString() + " install media"); } internal static void SetupCustomLogging(Package pkg, string sLogFilePath) diff --git a/SSIS/SSISHelpers.cs b/SSIS/SSISHelpers.cs index d5878f4..16b5f9d 100644 --- a/SSIS/SSISHelpers.cs +++ b/SSIS/SSISHelpers.cs @@ -15,13 +15,16 @@ public enum SsisTargetServerVersion { SQLServer2012 = 110, SQLServer2014 = 120, - SQLServer2016 = 130 + SQLServer2016 = 130, + SQLServer2017 = 140 } public static class SSISHelpers { -#if SQL2016 +#if SQL2017 + public const string CreationNameIndex = "6"; +#elif SQL2016 public const string CreationNameIndex = "5"; #elif SQL2014 public const string CreationNameIndex = "4"; @@ -66,7 +69,9 @@ private static SsisTargetServerVersion CompilationVersion { get { -#if SQL2016 +#if SQL2017 + return SsisTargetServerVersion.SQLServer2017; +#elif SQL2016 return SsisTargetServerVersion.SQLServer2016; #elif SQL2014 return SsisTargetServerVersion.SQLServer2014; @@ -74,7 +79,7 @@ private static SsisTargetServerVersion CompilationVersion return SsisTargetServerVersion.SQLServer2012; #endif } - } + } /// /// Get the SsisTargetServerVersion of a project. See PackageHelper.SetTargetServerVersion and PackageHelper.TargetServerVersion or actual usage. diff --git a/SSIS/VariablesWindowPlugin.cs b/SSIS/VariablesWindowPlugin.cs index 87bc251..cb9619a 100644 --- a/SSIS/VariablesWindowPlugin.cs +++ b/SSIS/VariablesWindowPlugin.cs @@ -22,7 +22,10 @@ public partial class VariablesWindowPlugin : BIDSHelperWindowActivatedPluginBase /// /// TODO: Make thks a base class, and inherit for variables and parameters window controls /// -#if SQL2016 + /// See vNextDebugCode comment below on how to get this GUID +#if SQL2017 + internal const string SSIS_VARIABLES_TOOL_WINDOW_KIND = "{DDC39177-57E8-413D-9382-9E92CE5DA83B}"; +#elif SQL2016 internal const string SSIS_VARIABLES_TOOL_WINDOW_KIND = "{9F0B409F-14B8-4D44-AFD0-1099A3FB8BA3}"; #elif SQL2014 internal const string SSIS_VARIABLES_TOOL_WINDOW_KIND = "{826881A1-F158-483E-A118-8D5289CB6F1C}"; @@ -73,6 +76,8 @@ private void HookupVariablesWindow(Window GotFocus) try { if (GotFocus == null) return; + //when the next version of SQL comes along find the GUID uncomment this code; vNextDebugCode + //if (GotFocus.Caption == "Variables") package.Log.Verbose(GotFocus.ObjectKind); if (GotFocus.ObjectKind != SSIS_VARIABLES_TOOL_WINDOW_KIND) return; //if not the variables window } catch //ObjectKind property blows up on some windows diff --git a/extension2016.vsixmanifest b/extension2016.vsixmanifest new file mode 100644 index 0000000..eee7bd9 --- /dev/null +++ b/extension2016.vsixmanifest @@ -0,0 +1,23 @@ + + + + BIDS Helper for Visual Studio 2015 + BIDS Helper is an extension for BIDS / SSDT-BI that includes numerous enhancements for SQL Server BI projects + https://bidshelper.codeplex.com/documentation + License.rtf + BIDSHelper.ico + BIDSHelperMontage.gif + SSDT,SSIS,SSAS,SSRS,BIDS,SQL Server Data Tools,Integration Services,Analysis Services,Reporting Services + + + + + + + + + + + + + \ No newline at end of file