我正在尝试使用自定义操作从Visual Studio 2010 Web设置项目创建新数据库。 首先,我创建了一个From,用户在其中选择了sql server的名称和authantication的模式。我使用以下命令获取服务器名称:
public string ServerString { get; set; }
private void SetServerString()
{
string cs;
if (cbInstant.SelectedIndex == 0) // windows authentication
cs = cbServer.SelectedValue.ToString();
else
cs = string.Format(cbServer.SelectedValue + ";" + txtUser.Text + ";" + txtPassword.Text);
ServerString = cs;
}
private void btnNext_Click(object sender, EventArgs e)
{
SetServerString();
formContext.Parameters["ServerString"] = this.ServerString;
this.Close();
}
效果很好,我得到了例如" PCName \ SQLEXPRESS"。
在自定义操作中:
public override void Install(System.Collections.IDictionary stateSaver)
{
string serverString = "";
if (this.Context.Parameters["ServerString"] != null)
serverString = this.Context.Parameters["ServerString"];
base.Install(stateSaver);
MakeSQLDatabase(connectionString);
}
private void MakeSQLDatabase(string serverString)
{
FileInfo file = new FileInfo("M:\\script.sql");
string script = file.OpenText().ReadToEnd();
file.OpenText().Close();
SqlConnection sqlConnection = new SqlConnection();
SqlConnectionStringBuilder sqlConnectionStringBuilder = new SqlConnectionStringBuilder();
sqlConnection.ConnectionString = sqlConnectionStringBuilder.ToString();
Server server = new Server(sqlConnection);
server.ConnectionContext.ServerInstance = (serverString);
server.ConnectionContext.Connect();
if (server.Databases["databasename"] != null)
{
server.KillAllProcesses("databasename");
server.KillDatabase("databasename");
}
Database database = new Database(server, "databasename");
database.Create();
database.ExecuteNonQuery(script);
}
我收到错误"服务器未找到或无法访问"但是如果我将变量serverString更改为
@"PCName\SQLEXPRESS"
它有效!!我无法弄清问题是什么。我无法使用Microsoft.SqlServer.Management.Smo,因为版本2和版本4之间存在冲突。即使添加了app.confg
<?xml version="1.0"?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
</configuration>
感谢您的帮助,或者您可以指导我找到更好的解决方案来完成这项任务。提前谢谢。
答案 0 :(得分:1)
我不明白,你想用.NET 2而不是.NET 4创建一个新的数据库?我是nerver使用SMO但是也会尝试:) Atm我只是连接master数据库使用SQL todo工作“CREATE DATABASE”。只要您与“主”数据库建立有效连接,就可以正常工作。
更新:
var sql = "";
using (var cnn = new SqlConnection(connection))
{
cnn.Open();
sql = "CREATE DATABSE <databasename>";
using (var cmd = new SqlCommand(sql, cnn))
{
try
{
cmd.CommandTimeout = 120;
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
Console.WriteLine("Execution error!\n\n" + sql + "\n\n\n" + ex);
}
}
sql = "USE DATABSE <databasename>;EXEC sp_dbchangeowner <Username>";
using (var cmd = new SqlCommand(sql, cnn))
{
try
{
cmd.CommandTimeout = 120;
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
Console.WriteLine("Execution error!\n\n" + sql + "\n\n\n" + ex);
}
}
cnn.Close();
}
连接必须是与“主”数据库的连接。 并需要更换。 如果你想这样做,那就像:
sql = string.Format("USE DATABSE {0};EXEC sp_dbchangeowner {1}",database,username);
使用数据库名称“master”设置的连接。 然后你完成了,可以设置这样的任何数据库。
要检查SQL中的帮助,您可以添加到第一个SQL a:
IF ( (SELECT IsNull(db_id('latest'),-1) )>0 )
希望这会有所帮助。我不知道这是否是最聪明的方式,但在这种情况下,我可以简单地连接,然后创建,更改等任何我想要的东西。 在我的情况下,我完全创建一个数据库,使用stringbuilder加载一堆sql命令,并对新数据库执行所有CREATE表/列/查询语句。 删除DB是一个简单的“DROP DATABASE”。