我正在尝试使用自定义操作从 Visual Studio 2010 Web 设置项目创建一个新数据库。首先,我做了一个 From 用户选择他们的 sql 服务器的名称和身份验证模式的地方。我使用以下内容获取服务器名称:
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>
感谢您的帮助,或者您能否指导我找到更好的解决方案来完成此任务。提前致谢。