C# 从sql server生成的脚本填充数据库
所以我正在开发一个web应用程序,每个用户都有自己的数据库。我想要的是在用户注册时自动创建特定于用户的数据库 我的想法是使用自定义名称创建一个新的空数据库,然后运行一个预生成的sql脚本来生成该数据库的表和默认值 编辑 我想我以前不太清楚 我按如下方式创建数据库:C# 从sql server生成的脚本填充数据库,c#,sql-server,asp.net-mvc-4,entity-framework-4,C#,Sql Server,Asp.net Mvc 4,Entity Framework 4,所以我正在开发一个web应用程序,每个用户都有自己的数据库。我想要的是在用户注册时自动创建特定于用户的数据库 我的想法是使用自定义名称创建一个新的空数据库,然后运行一个预生成的sql脚本来生成该数据库的表和默认值 编辑 我想我以前不太清楚 我按如下方式创建数据库: using (var conn = new SqlConnection("data source=MySource; uid=MyUser; pwd=MyPassword;")) { using (var cmd =
using (var conn = new SqlConnection("data source=MySource; uid=MyUser; pwd=MyPassword;"))
{
using (var cmd = new SqlCommand())
{
conn.Open();
cmd.Connection = conn;
cmd.CommandText = "Create Database MYNewDB;";
cmd.ExecuteNonQuery();
}
}
有没有办法(在此之后)执行保存在.sql文件中的脚本来创建此新数据库的表和值?在上找到了解决方案
使用(var conn=new SqlConnection(“数据源=MySource;初始目录=MYNewDB;持久安全信息=True;用户id=MyUser;密码=MyPassword;multipleactiveresultsets=True;”)
{
string script=File.ReadAllText(@“C:\Somewhere\…\script.sql”);
//运行时拆分脚本命令
IEnumerable commandStrings=Regex.Split(脚本@“^\s*GO\s*$”,RegexOptions.Multiline | RegexOptions.IgnoreCase);
conn.Open();
foreach(commandStrings中的字符串commandString)
{
if(commandString.Trim()!=“”)
{
使用(var命令=新的SqlCommand(commandString,conn))
{
command.ExecuteNonQuery();
}
}
}
康涅狄格州关闭();
}
您预计有多少用户?你考虑过更新脚本吗?对我来说,这听起来像是一个非常痛苦的架构。在每个表中添加一列UserID,并确保每个查询都有额外的检查,会简单得多。请说明您发现哪些方法不起作用(即链接+一句话描述将是完美的),或者根本不添加此类文本。例如,“尝试过,但XXXX阻止我这么做”)@SeanLange这是我公司开发的软件的网络版本。如果只有20%的客户坚持,我们将讨论350到450个客户,他们可以有超过1个不同的用户,在表中,他们将包括自己的客户。我认为最好为每个客户端保留一个数据库。因此,当你更新软件时,你必须更新350-450个数据库。对我来说,这听起来并不有趣。要回答您的问题,您需要创建一个脚本来创建数据库xxx等
using (var conn = new SqlConnection("data source=MySource; initial catalog=MYNewDB;persist security info=True;user id=MyUser;password=MyPassword;multipleactiveresultsets=True; "))
{
string script = File.ReadAllText(@"C:\Somewhere\...\script.sql");
// split script on GO command
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();
}
}
}
conn.Close();
}