Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Asp Net核心多个连接字符串_C#_Asp.net Mvc - Fatal编程技术网

C# Asp Net核心多个连接字符串

C# Asp Net核心多个连接字符串,c#,asp.net-mvc,C#,Asp.net Mvc,我将根据要求尝试添加更多信息: appsettings.json "ConnectionStrings": { "Debug": "server=Server;user id=myuser;password=password;port=3306;database=database1;", "Demo": "server=Server;user id=myuser;password=pass

我将根据要求尝试添加更多信息:

appsettings.json

 "ConnectionStrings": {
    "Debug": "server=Server;user id=myuser;password=password;port=3306;database=database1;",
    "Demo": "server=Server;user id=myuser;password=password;port=3306;database=database2;"
  }
两台服务器都相同,但有两个不同的数据库(例如1和2)

Startup.cs

services.AddTransient<AppDb>(_ => new Controllers.AppDb(Configuration["ConnectionStrings:Database1"]));
            services.AddTransient<AppDb>(_ => new Controllers.AppDb(Configuration["ConnectionStrings:Database2"]));
我有一个调用并连接到数据库的程序,但它只连接到数据库1

客户端控制器

namespace ProjectDatabase.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ClientsController : ControllerBase
    {
        public ClientsController(AppDb db)
        {
            Db = db;
        }

        // GET api/clients
        [HttpGet]
        public async Task<IActionResult> GetLatest()
        {
            await Db.Connection.OpenAsync();
            var query = new clientsQuery(Db);
            var result = await query.LatestClientsAsync();
            return new OkObjectResult(result);
        }

       
        public AppDb Db { get; }
    }
}
namespace ProjectDatabase.Controllers
{
[路由(“api/[控制器]”)]
[ApiController]
公共类客户端控制器:ControllerBase
{
公共客户端控制器(AppDb)
{
Db=Db;
}
//获取api/客户端
[HttpGet]
公共异步任务GetLatest()
{
等待Db.Connection.OpenAsync();
var query=new clientsQuery(Db);
var result=await query.LatestClientsAsync();
返回新的OkObjectResult(结果);
}
公共AppDb数据库{get;}
}
}
我对数据库1发出Get请求

问题:我已经连接到Database1,并且希望一次连接一个Database2,如何实现这一点?我如何告诉应用程序从数据库2获取数据?我已经有了第二个连接字符串如何访问它们


为更清晰起见进行了编辑。

如果我理解正确,您希望在取决于环境的连接之间切换

因此,您可以查看asp.net配置

创建2个环境文件,然后将连接字符串放入其中

例如:

appsettings.Development.json

appsettings.Demo.json

您的设置代码如下所示

services.AddTransient(_ => new 
Controllers.AppDb(Configuration["ConnectionStrings:MySql"]));
所以在那个些操作之后,你们只需要切换环境,就可以得到正确的连接字符串

了解如何设置多环境配置,您可以在此处:

这是我的AppDb.cs,我的
控制器
用于连接,如果我添加第二个MySqlConnection,然后在我的客户端控制器中指定要打开的连接,该怎么办

namespace ProjectDatabase.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ClientsController : ControllerBase
    {
        public ClientsController(AppDb db)
        {
            Db = db;
        }

        // GET api/clients
        [HttpGet]
        public async Task<IActionResult> GetLatest()
        {
            await Db.Connection.OpenAsync();
            var query = new clientsQuery(Db);
            var result = await query.LatestClientsAsync();
            return new OkObjectResult(result);
        }

       
        public AppDb Db { get; }
    }
}
namespace ProjectDatabase.Controllers
{
[路由(“api/[控制器]”)]
[ApiController]
公共类客户端控制器:ControllerBase
{
公共客户端控制器(AppDb)
{
Db=Db;
}
//获取api/客户端
[HttpGet]
公共异步任务GetLatest()
{
等待Db.Connection.OpenAsync();
var query=new clientsQuery(Db);
var result=await query.LatestClientsAsync();
返回新的OkObjectResult(结果);
}
公共AppDb数据库{get;}
}
}
我可以创建另一个
Controller
来代替wait
Db.Connection.OpenAsync()
,并使用wait
Db.Con.OpenAsync()
,这将是我与第二个数据库的第二个连接


这是不会给我带来任何问题或缺点的吗?

Startup.cs:

 services.AddTransient<AppDb>(_ => new Controllers.AppDb(Configuration["ConnectionStrings:Debug"], Configuration["ConnectionStrings:Demo"]));  

已解决。

为什么您不使用实体框架、dapper或任何ORM?还有,您会遇到什么错误?如果我将注释从该行中删除,我将得到以下错误:InvalidCastException:无法将类型为“System.DBNull”的对象强制转换为类型为“System.String”。应用程序如何知道您需要什么连接?您希望如何更改连接?这正是我想弄明白的,我希望在用户命令上从两个数据库获取数据,例如,用户希望从调试中获取所有客户端,获取它。用户现在希望将数据库更改为第二个名为Demo的数据库,并从该数据库获取所有客户端的列表。我基本上希望连接到这两个数据库,完成请求并准备就绪,以便在Angular中,用户选择Database1或Database2并获取客户端列表。在appsettings.json文件中不可能这样做吗?如何在连接之间切换?例如,我们的想法是准备好两个数据库的连接,从一个数据库获取数据,然后选择第二个数据库从该数据库获取数据。基本上,这两个连接都可以使用,稍后我会询问用户希望连接到哪个数据库。
services.AddTransient(_ => new 
Controllers.AppDb(Configuration["ConnectionStrings:MySql"]));
namespace ProjectDatabase.Controllers
{
    public class AppDb
    {
        public MySqlConnection Connection { get; }

        public MySqlConnection Con { get; }
        

        public AppDb(string connectionString)
        {
            Connection = new MySqlConnection(connectionString);

            Con = new MySqlConnection(connectionString);
        }

        public void Dispose() => Connection.Dispose();
    }
}
namespace ProjectDatabase.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ClientsController : ControllerBase
    {
        public ClientsController(AppDb db)
        {
            Db = db;
        }

        // GET api/clients
        [HttpGet]
        public async Task<IActionResult> GetLatest()
        {
            await Db.Connection.OpenAsync();
            var query = new clientsQuery(Db);
            var result = await query.LatestClientsAsync();
            return new OkObjectResult(result);
        }

       
        public AppDb Db { get; }
    }
}
 services.AddTransient<AppDb>(_ => new Controllers.AppDb(Configuration["ConnectionStrings:Debug"], Configuration["ConnectionStrings:Demo"]));  
 public class AppDb
    {

       
        public MySqlConnection conDebug { get; }

        public MySqlConnection conDemo { get; }


        

        public AppDb(string connectionStringDebug, string connectionStringDemo)
        {

            conDebug = new MySqlConnection(connectionStringDebug);

            Hashtable hasDB = new Hashtable();
            hasDB["debug"] = conDebug;

                      
        }

        public void Dispose() => conDebug.Dispose();
    }  
    
}