【发布时间】:2015-06-16 18:48:26
【问题描述】:
我有两个不同的数据库,客户端一个从.MDF 文件附加到.\SQLEXPRESS 服务器。主服务器在另一台名为COMPUTER_NAME 的计算机上的服务器上运行。
我想使用 C# 合并这些以运行 .SQL 文件。我将在下面粘贴我的代码以供参考,但基本上我的问题是,如果我使用
string sqlConnectionString = @"Server=.\SQLEXPRESS; Trusted_Connection=True";
然后我在COMPUTER_NAME 上找不到数据库。如果我使用
string sqlConnectionString = @"Server=COMPUTER_NAME; Trusted_Connection=True";
它将在 COMPUTER_NAME 的 C: 驱动器上查找我的 .MDF 文件,而不是本地计算机。
如何连接到不同服务器上的这两个数据库?
其他信息:
我正在使用的 SQL 脚本。当两个数据库都在同一台服务器上时,这可以完美地恢复,但我不能再这样做了。
CREATE DATABASE ClientDB
ON (Filename = 'C:\Clayton.mdf')
, (Filename = 'C:\Clayton_log.ldf')
FOR ATTACH;
-- update the client from the master
MERGE [ClientDB].[dbo].[table] trgt
using [MasterDB].[dbo].[table] src
ON trgt.id = src.id
WHEN matched AND trgt.lastmodified <= src.lastmodified THEN -- if master row is newer
UPDATE SET trgt.[info] = src.[info], ... -- update the client
WHEN NOT matched BY source -- delete rows added by client
THEN DELETE
WHEN NOT matched BY target -- insert rows added by master
THEN INSERT ( [info], ... ) VALUES (src.[info], ... );
-- close all connections to database
ALTER DATABASE ClientDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
-- detach database
EXEC sp_detach_db 'ClientDB', 'true';
我使用 C# 运行它,如下所示:
string sqlConnectionString = @"Server=.\SQLEXPRESS; Trusted_Connection=True";
string script = File.ReadAllText(Environment.CurrentDirectory + @"\MergeTotal.sql");
SqlConnection conn = new SqlConnection(sqlConnectionString);
IEnumerable<string> commandStrings = Regex.Split(script, @"^\s*GO\s*$",
RegexOptions.Multiline | RegexOptions.IgnoreCase);
conn.Open();
foreach (string commandString in commandStrings)
{
if (commandString.Trim() != "")
{
using (var command = new SqlCommand(commandString, conn))
{
command.ExecuteNonQuery();
}
}
}
我不在乎整个过程是发生在.SQL 还是C#,只要它具有预期的效果即可。
提前感谢您提供任何指导或建议。
【问题讨论】:
-
你需要多久运行一次?
-
我经常害怕。现在它的配置是每次程序启动时,它都会检查它是否与主数据库连接到网络,如果是则合并。
-
你可能不得不考虑重新设计它的工作方式,因为你不能像那样真正合并。您可能应该跟踪更改,然后在主服务器上重新制定它们。
-
就我的目的而言,这并不是一个真正可行的选择。必须有某种方法来编写两个数据库的脚本。我在玩
sp_addlinkedserver,我认为我在正确的轨道上。 -
所以在无所事事之后发现you can't use a merge on linked servers,所以我又回到了我开始的地方......
标签: sql sql-server connection-string sql-server-express