如何连接到 ASP.NET API (.Net 8) 控制器中的 MySQL 数据库。 两者都在单独的 docker 容器中运行。
这是我的 docker-compose.yml:
version: '3.4'
services:
database:
container_name: DB
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=1234
- MYSQL_DATABASE=db
- MYSQL_USER=user
- MYSQL_PASSWORD=secretpassword
- MYSQL_ALLOW_EMPTY_PASSWORD=1
volumes:
- dbdata:/var/lib/mysql
- ./MySqlScripts/init.sql:/docker-entrypoint-initdb.d/1.sql:ro
restart: on-failure
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
timeout: 20s
retries: 10
ports:
- 3306:3306
command: --default-authentication-plugin=mysql_native_password
api:
container_name: API
build:
context: .
dockerfile: API/Dockerfile
ports:
- 5092:8080
depends_on:
- database
volumes:
dbdata:
我想使用 MySql.Data(NuGet-Package)。
我尝试使用 docker-compose 文件的此配置进行连接,但它总是导致我收到“没有可用的 MySQL 主机”。
首先,您必须向 API 添加控制器或创建如下端点:
// here is only the endpoint
[HttpGet]
[Route("dbcheck")]
public IActionResult DbConnect() {
return Ok();
}
然后从 NuGet 添加 MySqlConnection
string connectionString = "";
MySqlConnection connection = new MySqlConnection(connectionString)
如您所见,您必须定义一个字符串(connectionString)。 对于该字符串的内容,我添加了以下接口来读取 appsettings.json 中的设置。 (见下文,稍后我会展示)
private readonly IConfiguration Configuration;
public NameOfTheController(IConfiguration configuration) {
Configuration = configuration;
}
现在可以像这样使用它了,你还可以看到第一个SQL命令:
string connectionString = Configuration["ConnectionStrings:essenskasse"] ?? "";
MySqlConnection connection = new MySqlConnection(connectionString)
MySqlCommand command = new MySqlCommand("SELECT * FROM Test", con);
此后即可建立连接。 要执行该命令,请使用 MySqlDataReader 并将读取器的结果填充到 DataTable 中:
connection.Open();
MySqlDataReader reader = command.ExecuteReader();
DataTable dataTable = new DataTable();
dataTable.Load(reader);
reader.Close();
connection.Close();
不要忘记最后的connection.Close()!
这是一个完整的演示控制器:
using Microsoft.AspNetCore.Mvc;
using MySql.Data.MySqlClient;
using System.Data;
namespace API.Controllers {
[Route("api/[controller]")]
[ApiController]
public class DemoController : ControllerBase {
private readonly IConfiguration Configuration;
public DemoController(IConfiguration configuration) {
Configuration = configuration;
}
[HttpGet, Route("dbcheck")]
public IActionResult DbConnect() {
try {
MySqlConnection connection = new MySqlConnection(Configuration["ConnectionStrings:mysql"]);
MySqlCommand command = new MySqlCommand("SELECT * FROM Test", connection);
connection.Open();
MySqlDataReader reader = command.ExecuteReader();
DataTable dataTable = new DataTable();
dataTable.Load(reader);
reader.Close();
connection.Close();
return Ok();
}
catch (Exception ex) {
return BadRequest(ex.ToString());
}
}
}
}
这是 API 的 appsettings.json:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"mysql": "Server=database;Port=3306;Uid=user;Pwd=secretpassword;Database=db;SslMode=None;"
}
}
使用SslMode=None是因为:https://stackoverflow.com/a/78042591
您也无法在 docker 上下文中连接到 localhost:3306。 相反,您应该使用服务名称,您的是数据库,所以我插入它。