Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不使用脚本的情况下从ASP.NET创建新的SQL Server数据库_Asp.net_Sql Server - Fatal编程技术网

如何在不使用脚本的情况下从ASP.NET创建新的SQL Server数据库

如何在不使用脚本的情况下从ASP.NET创建新的SQL Server数据库,asp.net,sql-server,Asp.net,Sql Server,我们有一个生产数据库,我们经常对其结构进行更改 为了从我们的ASP.NET应用程序创建一个新数据库,我们必须首先从当前数据库之一创建一个新脚本,然后从我们的ASP.NET项目运行它来创建一个新数据库 由于此过程是手动的,因此耗时且风险很大,因为在删除额外标记和添加其他参数时会发生错误 我想知道还有没有其他方法可以让我们使用ASP.NET从现有数据库克隆新数据库 非常感谢您的建议。dotnet ef没有db clone命令 您可以使用SSMS克隆/复制数据库,而不是创建脚本。然后在asp.net应

我们有一个生产数据库,我们经常对其结构进行更改

为了从我们的ASP.NET应用程序创建一个新数据库,我们必须首先从当前数据库之一创建一个新脚本,然后从我们的ASP.NET项目运行它来创建一个新数据库

由于此过程是手动的,因此耗时且风险很大,因为在删除额外标记和添加其他参数时会发生错误

我想知道还有没有其他方法可以让我们使用ASP.NET从现有数据库克隆新数据库


非常感谢您的建议。

dotnet ef没有db clone命令

您可以使用SSMS克隆/复制数据库,而不是创建脚本。然后在asp.net应用程序中更新连接字符串,测试并删除。 以下是MS SQL server的文档。

任何数据库都具有复制/克隆功能

如果您首先使用EF代码,请检查现有数据库的EF迁移

若需要仅使用应用程序复制db,则可以创建存储过程并从应用程序执行。详情如下

  • 使用动态T-SQL执行将源数据库备份到文件
  • 然后使用动态T-SQL再次使用带移动的还原数据库选项将备份还原到新数据库
  • 该程序采用6个参数(应提供所有参数):

  • 源数据库名称
  • 源数据库逻辑数据文件名
  • 源数据库逻辑日志文件名
  • 备份文件名和路径
  • 目标数据库名称
  • 数据库文件的目标数据库文件夹位置
  • 以下是T-SQL过程源代码:

    USE master;
    GO 
    CREATE PROCEDURE dbo.CloneDBUsingBackupRestore ( 
    @SourceDatabaseName VARCHAR(200) 
    ,@SourceDatafileLogicalName VARCHAR(200) 
    ,@SourceLogfileLogicalName VARCHAR(200) 
    ,@BackupFile VARCHAR(2000) 
    ,@TargetDatabaseName VARCHAR(200) 
    ,@TargetDatabaseFolder VARCHAR(2000) ) 
    AS 
    BEGIN 
    SET NOCOUNT ON
    DECLARE @tsql VARCHAR(2000) 
    DECLARE @TargetDataFile VARCHAR(2000) 
    DECLARE @TargetLogFile VARCHAR(2000) 
    SET @TargetDataFile = @TargetDatabaseFolder + @TargetDatabaseName + '.mdf'; 
    SET @TargetLogFile = @TargetDatabaseFolder + @TargetDatabaseName + '.ldf'; 
    -- Backup the Source Database
     IF @SourceDatabaseName IS NOT NULL 
    BEGIN 
      SET @tsql = CONCAT ( 'BACKUP DATABASE ' ,@SourceDatabaseName 
    ,' TO DISK = ' ,QUOTENAME(@BackupFile, '''') ) 
    PRINT 'Executing query : ' + @tsql; 
    EXEC (@tsql) 
    END
    
    -- Restore database from the Backup File into target Data File and target Log File 
    SET @tsql = CONCAT ( 'RESTORE DATABASE ' ,@TargetDatabaseName 
    ,' FROM DISK = ' 
    ,QUOTENAME(@BackupFile, '''') 
    ,' WITH MOVE ' 
    ,QUOTENAME(@SourceDatafileLogicalName, '''') ,
    ' TO ' ,QUOTENAME(@TargetDataFile, '''') ,' 
    , MOVE ' ,QUOTENAME(@SourceLogfileLogicalName, '''') 
    ,' TO ' ,QUOTENAME(@TargetLogFile, '''') ) 
    PRINT 'Executing query : ' + @tsql EXEC (@tsql) 
    SET NOCOUNT OFF 
    END GO
    
    使用ASP.Net代码调用

    using (SqlConnection con = new SqlConnection(connString))
    {
       using (SqlCommand cmd = new SqlCommand("dbo.CloneDBUsingBackupRestore", con))
       {
           cmd.CommandType = CommandType.StoredProcedure;
           cmd.Parameters.Add("@SourceDatabaseName", SqlDbType.VarChar).Value 
              ="Northwind";
           cmd.Parameters.Add("@SourceDatafileLogicalName ", SqlDbType.VarChar).Value 
              ="Northwind_Log";
           cmd.Parameters.Add("@BackupFile", SqlDbType.VarChar).Value 
              ="C:\SQL\nw.bak";
           cmd.Parameters.Add("@TargetDatabaseName", SqlDbType.VarChar).Value 
              ="NorthwindClone";
           cmd.Parameters.Add("@TargetDatabaseFolder ", SqlDbType.VarChar).Value 
              ="C:\SQL";
          con.Open();
    
          cmd.ExecuteNonQuery();  
          con.Close();  
        }
    }
    

    非常感谢您的评论,不幸的是,我们无法使用SSMS,因为这必须在我们的应用程序中自动完成,而且我们还没有使用EF。感谢您的时间和出色的报价:)