Пример #1
0
        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"));
            }
        }
Пример #2
0
 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"));
     }
 }
Пример #3
0
        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);
            }
        }
Пример #4
0
        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();
            }
        }
Пример #5
0
        /// <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();
        }
Пример #6
0
        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();
        }