public void Throws_InvalidOperationException_If_SQL_LocalDB_Not_Installed() { // Arrange var options = new SqlLocalDbOptions(); var registry = Mock.Of <Interop.IRegistry>(); using (var actual = new SqlLocalDbApi(options, registry, _loggerFactory)) { // Act and Assert Assert.Throws <InvalidOperationException>(() => actual.CreateInstance("name")); Assert.Throws <InvalidOperationException>(() => actual.DeleteInstance("name")); Assert.Throws <InvalidOperationException>(() => actual.DeleteUserInstances()); Assert.Throws <InvalidOperationException>(() => actual.GetDefaultInstance()); Assert.Throws <InvalidOperationException>(() => actual.GetInstanceInfo("name")); Assert.Throws <InvalidOperationException>(() => actual.GetInstanceNames()); Assert.Throws <InvalidOperationException>(() => actual.GetInstances()); Assert.Throws <InvalidOperationException>(() => actual.GetOrCreateInstance("name")); Assert.Throws <InvalidOperationException>(() => actual.GetVersionInfo("name")); Assert.Throws <InvalidOperationException>(() => actual.InstanceExists("name")); Assert.Throws <InvalidOperationException>(() => actual.LatestVersion); Assert.Throws <InvalidOperationException>(() => actual.ShareInstance("name", "sharedName")); Assert.Throws <InvalidOperationException>(() => actual.StartInstance("name")); Assert.Throws <InvalidOperationException>(() => actual.StartTracing()); Assert.Throws <InvalidOperationException>(() => actual.StopInstance("name")); Assert.Throws <InvalidOperationException>(() => actual.StopTracing()); Assert.Throws <InvalidOperationException>(() => actual.UnshareInstance("name")); } }
public void Throws_PlatformNotSupportedException() { // Arrange using (var actual = new SqlLocalDbApi(_loggerFactory)) { // Act and Assert Assert.Throws <PlatformNotSupportedException>(() => actual.CreateInstance("name")); Assert.Throws <PlatformNotSupportedException>(() => actual.DeleteInstance("name")); Assert.Throws <PlatformNotSupportedException>(() => actual.DeleteUserInstances()); Assert.Throws <PlatformNotSupportedException>(() => actual.GetDefaultInstance()); Assert.Throws <PlatformNotSupportedException>(() => actual.GetInstanceInfo("name")); Assert.Throws <PlatformNotSupportedException>(() => actual.GetInstanceNames()); Assert.Throws <PlatformNotSupportedException>(() => actual.GetInstances()); Assert.Throws <PlatformNotSupportedException>(() => actual.GetOrCreateInstance("name")); Assert.Throws <PlatformNotSupportedException>(() => actual.GetVersionInfo("name")); Assert.Throws <PlatformNotSupportedException>(() => actual.InstanceExists("name")); Assert.Throws <PlatformNotSupportedException>(() => actual.LatestVersion); Assert.Throws <PlatformNotSupportedException>(() => actual.ShareInstance("name", "sharedName")); Assert.Throws <PlatformNotSupportedException>(() => actual.ShareInstance("sid", "name", "sharedName")); Assert.Throws <PlatformNotSupportedException>(() => actual.StartInstance("name")); Assert.Throws <PlatformNotSupportedException>(() => actual.StartTracing()); Assert.Throws <PlatformNotSupportedException>(() => actual.StopInstance("name")); Assert.Throws <PlatformNotSupportedException>(() => actual.StopTracing()); Assert.Throws <PlatformNotSupportedException>(() => actual.UnshareInstance("name")); } }
public void Can_Delete_User_Instances() { // Arrange using (var actual = new SqlLocalDbApi(_loggerFactory)) { actual.CreateInstance(Guid.NewGuid().ToString()); IReadOnlyList <string> namesBefore = actual.GetInstanceNames(); // Act int deleted = actual.DeleteUserInstances(deleteFiles: true); // Assert deleted.ShouldBeGreaterThanOrEqualTo(1); IReadOnlyList <string> namesAfter = actual.GetInstanceNames(); int instancesDeleted = 0; foreach (string name in namesBefore) { if (!namesAfter.Contains(name)) { instancesDeleted++; } } instancesDeleted.ShouldBeGreaterThanOrEqualTo(1); } }
public void Test1() { // download sqlpackage https://docs.microsoft.com/fr-fr/sql/tools/sqlpackage-download?view=sql-server-2017 var databaseName = "Clients"; var instanceName = "Clients"; var currentDirectory = Directory.GetCurrentDirectory(); var localDB = new SqlLocalDbApi(); try { var instance = localDB.GetOrCreateInstance(instanceName); var manager = instance.Manage(); if (!instance.IsRunning) { manager.Start(); } var connectionString = instance.GetConnectionString(); using (var connection = new SqlConnection(connectionString)) { connection.Open(); ExecuteSql(connection, $@" USE master; IF (EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE ('[' + name + ']' = '[{databaseName}]' OR name = '{databaseName}'))) BEGIN ALTER DATABASE [{databaseName}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; DROP DATABASE [{databaseName}]; END "); } var mdfFile = new FileInfo( Path.Combine(currentDirectory, $"{databaseName}.mdf")); var ldfFile = new FileInfo( Path.Combine(currentDirectory, $"{databaseName}.ldf")); if (mdfFile.Exists) { mdfFile.Delete(); } if (ldfFile.Exists) { ldfFile.Delete(); } using (var connection = new SqlConnection(connectionString)) { connection.Open(); // create database ExecuteSql(connection, $@" CREATE DATABASE [{databaseName}] ON ( NAME = {databaseName}_data, FILENAME = '{mdfFile.FullName}' ) LOG ON ( NAME = {databaseName}_log, FILENAME = '{ldfFile.FullName}' ); "); // publish dacpac to newly created database PrepareDatabase(connectionString, databaseName); ExecuteSql(connection, $"USE [{databaseName}]"); // modify datas var insertNumber = 10000; for (var i = 1; i <= insertNumber; i++) { ExecuteSql(connection, $"INSERT INTO [Client] ([Name]) VALUES ('Client{i}')"); } // check datas var sqlCommand = new SqlCommand("SELECT count(*) FROM Client", connection); var result = sqlCommand.ExecuteScalar(); Assert.Equal(insertNumber, result); } manager.Stop(); } finally { localDB.DeleteUserInstances(true); localDB.Dispose(); } }
/// <summary> /// The main entry point to the application. /// </summary> /// <param name="args">The command-line arguments passed to the application.</param> internal static void Main(string[] args) { PrintBanner(); var options = new SqlLocalDbOptions() { AutomaticallyDeleteInstanceFiles = true, StopOptions = StopInstanceOptions.NoWait, }; var services = new ServiceCollection().AddLogging((p) => p.AddConsole().SetMinimumLevel(LogLevel.Debug)); var loggerFactory = services.BuildServiceProvider().GetRequiredService <ILoggerFactory>(); var localDB = new SqlLocalDbApi(options, loggerFactory); if (!localDB.IsLocalDBInstalled()) { Console.WriteLine(SR.SqlLocalDbApi_NotInstalledFormat, Environment.MachineName); return; } if (args?.Length == 1 && (string.Equals(args[0], "/deleteuserinstances", StringComparison.OrdinalIgnoreCase) || string.Equals(args[0], "--delete-user-instances", StringComparison.OrdinalIgnoreCase))) { localDB.DeleteUserInstances(deleteFiles: true); } IReadOnlyList <ISqlLocalDbVersionInfo> versions = localDB.GetVersions(); Console.WriteLine(Strings.Program_VersionsListHeader); Console.WriteLine(); foreach (ISqlLocalDbVersionInfo version in versions) { Console.WriteLine(version.Name); } Console.WriteLine(); IReadOnlyList <ISqlLocalDbInstanceInfo> instances = localDB.GetInstances(); Console.WriteLine(Strings.Program_InstancesListHeader); Console.WriteLine(); foreach (ISqlLocalDbInstanceInfo instanceInfo in instances) { Console.WriteLine(instanceInfo.Name); } Console.WriteLine(); string instanceName = Guid.NewGuid().ToString(); ISqlLocalDbInstanceInfo instance = localDB.CreateInstance(instanceName); var manager = new SqlLocalDbInstanceManager(instance, localDB); manager.Start(); try { if (IsCurrentUserAdmin()) { manager.Share(Guid.NewGuid().ToString()); } try { using (SqlConnection connection = manager.CreateConnection()) { connection.Open(); try { using (SqlCommand command = new SqlCommand("create database [MyDatabase]", connection)) { command.ExecuteNonQuery(); } using (SqlCommand command = new SqlCommand("drop database [MyDatabase]", connection)) { command.ExecuteNonQuery(); } } finally { connection.Close(); } } } finally { if (IsCurrentUserAdmin()) { manager.Unshare(); } } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } finally { manager.Stop(); localDB.DeleteInstance(instance.Name); } Console.WriteLine(); Console.Write(Strings.Program_ExitPrompt); Console.ReadKey(); }
internal static void Main(string[] args) { PrintBanner(); ISqlLocalDbApi localDB = new SqlLocalDbApiWrapper(); if (!localDB.IsLocalDBInstalled()) { Console.WriteLine(SR.SqlLocalDbApi_NotInstalledFormat, Environment.MachineName); return; } if (args?.Length == 1 && string.Equals(args[0], "/deleteuserinstances", StringComparison.OrdinalIgnoreCase)) { SqlLocalDbApi.DeleteUserInstances(deleteFiles: true); } ISqlLocalDbProvider provider = new SqlLocalDbProvider(); IList <ISqlLocalDbVersionInfo> versions = provider.GetVersions(); Console.WriteLine(Strings.Program_VersionsListHeader); Console.WriteLine(); foreach (ISqlLocalDbVersionInfo version in versions) { Console.WriteLine(version.Name); } Console.WriteLine(); IList <ISqlLocalDbInstanceInfo> instances = provider.GetInstances(); Console.WriteLine(Strings.Program_InstancesListHeader); Console.WriteLine(); foreach (ISqlLocalDbInstanceInfo instanceInfo in instances) { Console.WriteLine(instanceInfo.Name); } Console.WriteLine(); string instanceName = Guid.NewGuid().ToString(); ISqlLocalDbInstance instance = provider.CreateInstance(instanceName); instance.Start(); try { if (IsCurrentUserAdmin()) { instance.Share(Guid.NewGuid().ToString()); } try { using (SqlConnection connection = instance.CreateConnection()) { connection.Open(); try { using (SqlCommand command = new SqlCommand("create database [MyDatabase]", connection)) { command.ExecuteNonQuery(); } using (SqlCommand command = new SqlCommand("drop database [MyDatabase]", connection)) { command.ExecuteNonQuery(); } } finally { connection.Close(); } } } finally { if (IsCurrentUserAdmin()) { instance.Unshare(); } } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } finally { instance.Stop(); localDB.DeleteInstance(instance.Name); } Console.WriteLine(); Console.Write(Strings.Program_ExitPrompt); Console.ReadKey(); }