如何为现有连接建立动态创建的新数据库的连接字符串?

问题描述 投票:1回答:3

我有查询动态创建数据库。

    private void ExecuteNonQuery(string sql)
    {
        using (var connection = new SqlConnection(_connectionString))
        {
            connection.Open();
            SqlCommand command = connection.CreateCommand();
            command.CommandText = sql;
            command.ExecuteNonQuery();
        }
    }

    private void CreateDatabase(string databaseName)
    {
        try
        {
            ExecuteNonQuery($"CREATE DATABASE {databaseName}");
        }
        catch (Exception e)
        {
            throw new Exception($"Can't create database '{databaseName}'");
        }
    }

数据库将使用我现有的连接创建,但我需要为这个新数据库创建连接字符串以运行迁移和其他各种用途。

这怎么可能 ?

Update

它实际上是为了用户可以填写表单来创建一个新的数据库,在那里他们可以提供他们现有的连接字符串,或者如果他们没有手头,我们为他们构建它

c# database entity-framework connection-string
3个回答
0
投票

使用此函数来获取与新数据库的连接:

private SqlConnection NewDatebaseConnection(string databaseName)
    {
        SqlConnection  connection = new SqlConnection(_connectionString);
        connection.ChangeDatabase(databaseName);
        return SqlConnection;  
    }

0
投票

要保存新连接,可以将ConnectionStringBuilder与现有连接一起使用,更改数据库名称并将其保存到app.config

1.获取连接字符串的方法:

string GetConnectionString(string name) =>
          ConfigurationManager.ConnectionStrings[name].ConnectionString;

2.Helper方法,为app.config保存新的连接字符串:

void CreateNewConnectionString(string baseName, string newName, string newDatabaseName)
{
    // Get the connection string a new connection will be based on
    string baseConnString =
        ConfigurationManager.ConnectionStrings[baseName].ConnectionString;
    // For simplicity of manipulations with connection strings,
    // we use SqlConnectionStringBuilder, passing it an existing connection string
    var connBuilder = new SqlConnectionStringBuilder(baseConnString);
    // Change existing database name to the new database name
    connBuilder.InitialCatalog = newDatabaseName;
    // Create new settings, holding our new connection string
    var newConnection = new ConnectionStringSettings(newName, connBuilder.ToString());
    // Save new connection string
    var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    config.ConnectionStrings.ConnectionStrings.Add(newConnection);
    config.Save(ConfigurationSaveMode.Modified);
}

3.Usage

private void CreateDatabase(string databaseName)
{
    try
    {
        // Create database using "main" connection string
        ExecuteNonQuery($"CREATE DATABASE {databaseName}", "main");
        // Create new connection string "my_db" based on "main"
        CreateNewConnectionString("main", "my_db", databaseName);
    }
    catch (Exception e)
    {
        throw new Exception($"Can't create database '{databaseName}'");
    }
}

0
投票

如果您使用EF,则应该有一个上下文可以使用,如下所示:

public class MyContext : DbContext
{
    public MyContext():base("myConnectionStringName")
    {
    }
}

constructor有一个参数,用于指定连接名称或连接字符串。因此,您可以获取所需的任何连接字符串的上下文:

using (var db = new MyContext("connection_string_containing_new_db") 
{
    // do stuff with the context
}

您应该考虑使用构建此类上下文的工厂:

class MyContextFactory
{
    MyContext CreateContextForDatabase(string dbName) 
    {
         var builder = new SqlConnectionStringBuilder();
         builder["Data Source"] = "server\\instance";
         builder["integrated Security"] = true;
         builder["Initial Catalog"] = dbName;

         return new new MyContext(builder.ConnectionString);
    }
}

该代码使用SqlConnectionStringBuilder构建(从头开始)连接字符串。另一种方法是使用var builder = new SqlConnectionStringBuilder(staticConnectionString)解析静态连接字符串,只更改Initial Catalog

© www.soinside.com 2019 - 2024. All rights reserved.