Подключите API ASP.NET к базе данных MySQL

Как я могу подключиться к базе данных MySQL в контроллере ASP.NET API (.Net 8). Оба работают в отдельном докер-контейнере.

Вот мой 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».

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сначала вы должны добавить контроллер в свой API или создать конечную точку следующим образом:

// here is only the endpoint
[HttpGet]
[Route("dbcheck")]
public IActionResult DbConnect() {
    return Ok();
}

Затем добавьте MySqlConnection из NuGet.

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());
            }
        }
    }
}

А вот appsettings.json для API:

{
  "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

Вы также не можете подключиться к localhost:3306 в контексте докера. Вместо этого вам следует использовать имя службы, у вас было имя базы данных, поэтому я вставляю его.

Другие вопросы по теме