Как подключиться к Sql Server в Docker на macOS?

Создал консольный проект, пишу на Visual Studio Code используя macOS, вот код подключения:

public class ApplicationContext : DbContext
{
    public DbSet<User> Users { get; set; }

    public ApplicationContext()
    {
        Database.EnsureCreated();
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("Server=localhost\\mssqllocaldb;Database=thevckitdb;user=sa;password=@Generally090");
    }
}

Самый простой пример добавления данных:

static void Main(string[] args)
{
    try
    {
        using (ApplicationContext db = new ApplicationContext())
        {
            // создаем два объекта User
            User user1 = new User { Name = "Tom", Age = 33 };
            User user2 = new User { Name = "Alice", Age = 26 };

            // добавляем их в бд
            db.Users.Add(user1);
            db.Users.Add(user2);
            db.SaveChanges();
            Console.WriteLine("Объекты успешно сохранены");

            // получаем объекты из бд и выводим на консоль
            var users = db.Users.ToList();
            Console.WriteLine("Список объектов:");
            foreach (User u in users)
            {
                Console.WriteLine($"{u.Id}.{u.Name} - {u.Age}");
            }
        }
    }
    catch (System.Exception ex)
    {
        // TODO
        System.Console.WriteLine(ex.Message, ex.Source);
    }
}

При запуске проекта exception:

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 25 - Connection string is not valid)

Напоминаю, что работаю на macOS


Ответы (1 шт):

Автор решения: S.H.

Уважаемые коллеги, мне кажется, что Вы уже дали достатчоно информации автору вопроса для того, чтобы он мог самостоятельно справиться с проблемой.

я заранее приношу свои извинения, если я в ответе повторю советы, котрые уже даны в комментариях.

Итак, у нас есть задача: запустить приложение, написанное на NET Core, и работающее с базой данных MS SQL.

Я бы решал эту задачу так:

Шаг 1. Запускаем MS SQL.

Это делается командой

    sudo docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<здесь должен быть пароль SA>" -v /mssql_data:/var/opt/mssql/data -p 1433:1433  --name sql1 -h sql1 -d mcr.microsoft.com/mssql/server:2019-latest

В этой команде sql1 - это имя контейнера, mcr.microsoft.com/mssql/server:2019-latest - это имя образа, из которого устанавливается MS SQL

В результате должен запуститься контейнер с базой, проверить это можно командой sudo docker ps - в списке должен быть контейнер sql1.

Шаг 2. Создаём базу данных (или восстанавливаем её из бэкапа)

Microsoft предлагает Действительно удобную штуку - Microsoft SQL management studio - которая пока, кажется, всё таки рабоатет только под windows :-(

К счастью, есть проект

https://github.com/Microsoft/azuredatastudio

который работает и под MacOS. По моему, разобраться по документации, которая есть в репозитории, не очень сложно. Для определенности назовём базу данных, которую мы создали MyDatabase

Шаг 3. Проверяем, что мы можем приконнектиться из NET Core.

Я предлагаю простой "рабоче-крестьянский" метод - создать простое console app (dotnet new console), добавить туда зависимость dotnet add package System.Data.SqlClient и вписать проверочный код, котрый открывает connection.

В результате я получил проект (корый я назвал SqlTest), который содержит вот такой SqlTest.csproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="System.Data.SqlClient" Version="4.8.3" />
  </ItemGroup>

</Project>

и вот такой Program.cs:

    using System;
    using System.Data.SqlClient;

    namespace SqlTest
    {
        class Program {
            static void Main(string[] args) {
                const string sqlConnectionString = "Password=<your password here>;Persist Security Info=True;User ID=sa;Initial Catalog=MyDatabase;Data Source=localhost";
                try{
                    using( SqlConnection cn = new SqlConnection(sqlConnectionString) ){
                        cn.Open();
                        Console.WriteLine("Hey! Connection open!");
                    }
                } catch(Exception ex) {
                    Console.WriteLine($"Error: {ex.Message}");
                }
            }
        }
    }

Естественно, выражение <your password here> нужно заменить на Ваш пароль. Вместо localhost можно вписывать конкретный ip (например, в случае, когда контейнер запущен не на локальной машине)

В результате запуска должна быть выведена строка об успешном подключении к базе.

Всё, мы создали sqlConnectionString и проверили, что с этой строкой подключения подключение работает.

Теперь можно переносить эту строку в любые другие проекта на основе NET Core.

Теперь еще раз посмотрим, какие шаги мы предприняли:

запустили контейнер с базой, и специфицировали, какой порт должен "из него торчать наружу" (1433, пор по умолчанию, поэтому в SQL connection string его можно не писать)

Создали базу данных. При этом пока мы работаем от имени пользователя SA, что, вообще то, не рекомендуется по соображениям безопасности, но вполне допустимо на начальном (учебном) этапе

Создали простое как рельсы приложение, в котором просто негде ошибиться, и с его помощью проверили, что подключение работает.

Если на каком то из этих этапов возникли ошибки - пишите, будем думать дальше!

→ Ссылка