gpt4 book ai didi

c# - 如何通过C#代码导出数据库并在本地导入?

转载 作者:行者123 更新时间:2023-11-30 18:27:10 26 4
gpt4 key购买 nike

如何通过 C# 应用程序将数据库从远程服务器“克隆”到 LocalDB 数据库?不需要返回到远程数据库的关系。

背景

应用程序是使用 .NET 4.5.2 用 C# 编写的,支持两种模式 - 连接到远程 MS SQL Server 数据库的在线模式和连接到 LocalDB 数据库的离线模式。该应用程序主要针对较新版本的服务器(如果重要,仅支持 2014 版即可)。

在用户下线之前,它应该要求应用程序将远程数据库克隆到 LocalDB 数据库(本地数据库被完全覆盖)。本地数据库应该独立于远程数据库,即没有从属也没有复制。

在线和离线连接字符串都包含各自数据库的名称。应用程序本身不直接知道数据库名称或表名称,因为这是由连接字符串和 Entity Framework 管理的。

问题

如何将远程数据库“克隆”到 LocalDB 数据库(远程数据库名称和 LocalDB 数据库名称可能不同)?

我更喜欢不需要启动外部程序的解决方案,但这不是硬性要求。

问题

通过 Entity Framework 复制没有跟踪实体是 Not Acceptable 缓慢。

我知道 BACKUP DATABASERESTORE DATABASE 命令,但我发现了以下困难:

  1. 他们要求我指定数据库的名称。有没有办法将它们默认为指定为连接字符串一部分的初始数据库?

  2. RESTORE DATABASE 命令包含光盘上各个数据文件的名称和路径(MOVE 部分)。有没有办法通过仅指定数据库名称而不提供数据文件路径来处理它?或者如何通过 SQL 命令获取数据文件路径(要获取文件名,我将只创建一个空白数据库,获取文件名,可选择删除数据库并使用检索到的文件名)?

有更好的方法吗?

最佳答案

我使用我创建的存储过程,但首先您需要创建一个链接服务器:

IF EXISTS(SELECT name FROM sys.servers WHERE name = 'SERVER')
BEGIN--
EXEC sp_dropserver 'SERVER', 'droplogins'
END

/****** Object: LinkedServer [SERVER] create LinkedServer ******/
EXEC master.dbo.sp_addlinkedserver
@server = N'SERVER',
@srvproduct=N'SQLNCLI',
@provider=N'SQLNCLI',
@datasrc=N'192.168.1.1' -- IP address of a server

/* Add login data*/
EXEC sp_addlinkedsrvlogin
@useself='FALSE',
@rmtsrvname='SERVER',
@rmtuser='User',
@rmtpassword='Pass'

然后您可以在本地服务器上创建存储过程或直接从应用程序执行查询,同样为了安全起见,我在此示例中使用事务:

USE [DB]
GO
/****** Object: StoredProcedure [dbo].[backupdatabase] ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[backupdatabase]
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
BEGIN TRY
BEGIN TRANSACTION
TRUNCATE TABLE [dbo].[table_1]
INSERT INTO [dbo].[table_1]
SELECT * FROM [SERVER].[DB].[dbo].[table_1]


TRUNCATE TABLE [dbo].[table_2]
INSERT INTO [dbo].[table_2]
SELECT * FROM [SERVER].[DB].[dbo].[table_2]


TRUNCATE TABLE [dbo].[table_3]
INSERT INTO [dbo].[table_3]
SELECT * FROM [SERVER].[DB].[dbo].[table_3]
COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRANSACTION
DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int
SELECT @ErrMsg = ERROR_MESSAGE(),
@ErrSeverity = ERROR_SEVERITY()
RAISERROR(@ErrMsg, @ErrSeverity, 1)
END
END CATCH
END

关于c# - 如何通过C#代码导出数据库并在本地导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27176768/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com