Код C# не может подключиться к базе данных SQL Azure

Я пытаюсь подключиться к образцу базы данных, созданному в Azure с помощью C# (.NET Core 3.1). Я включил свой IP-адрес в правилах брандмауэра Azure. Я могу без проблем использовать обозреватель объектов SQL Server VS2019 для подключения и просмотра базы данных внутри.

Однако, когда я запускаю простое приложение C# на том же ПК для выполнения запроса для подсчета количества записей в таблице, оно выдает следующее исключение в точке открытия соединения (conn.Open());

При установлении соединения с SQL Server произошла ошибка, связанная с сетью или конкретным экземпляром. Сервер не найден или не был доступен. Убедитесь, что имя экземпляра указано правильно и что SQL Server настроен на разрешение удаленных подключений. (поставщик: поставщик TCP, ошибка: 0 — запрошенный адрес недействителен в своем контексте.)

Код С#;

using System;
using System.Data.SqlClient;

namespace AzureSql2
{
  class Program
  {
    static void Main(string[] args)
    {
      string connStr = " Server=tcp:beaconsqlsql.database.windows.net,1433;Initial Catalog=MRP2;Persist Security Info=False;User ID=beaconadmin;Password=********;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;";
      Console.WriteLine("Building connection");
      try
      {
        using (var conn = new SqlConnection(connStr))
        {
          Console.WriteLine("Creating command");
          using (var command = conn.CreateCommand())
          {
            command.CommandText = "SELECT COUNT(*) FROM [dbo].[Table]";

            Console.WriteLine("Opening connection");
            conn.Open();

            Console.WriteLine("Reading database");
            using (var reader = command.ExecuteReader())
            {
              while (reader.Read())
              {
                Console.WriteLine("Record count: {0}", reader.GetInt32(0));
              }
            }
          }
        }
      }
      catch (Exception ex)
      {
        Console.WriteLine("Exception: " + ex.Message);
      }

      Console.WriteLine("Press Enter to exit");
      Console.ReadLine();
    }
  }
}

Я пытался временно отключить брандмауэр на своем ПК, но это ничего не изменило. Тот факт, что обозреватель объектов SQL Server может подключаться, но код C# не может, заставляет думать, что есть проблема с кодом C#, но я не вижу никаких различий между ним и примерами, которые я просматривал.

Ваш стол действительно называется "стол"? Пожалуйста, поделитесь запутанной строкой подключения к Azure.

Mitch Wheat 25.01.2023 04:42

Вы читали что-нибудь вроде mderriey.com/2020/07/17/… ?

Jeremy Lakeman 25.01.2023 04:58

Да, таблица действительно называется «таблица» — база данных — это просто базовый эксперимент с одной таблицей. Ошибка возникает при первом открытии соединения, поэтому я бы подумал, что имя таблицы в этот момент не имеет значения (?). Строка подключения: Источник данных = beaconsqlsql.database.windows.net; Исходный каталог = MRP2; Идентификатор пользователя = beaconadmin; Пароль = *********; Время ожидания подключения = 30; Шифрование = True; TrustServerCertificate = False; Приложение‌ ​tionIntent=ReadWrite‌​;MultiSubnetFailover‌​=False

P. Szk. 25.01.2023 04:59

Я не уверен, что это сработает, но не могли бы вы попробовать изменить источник данных на beaconsqlsql.database.windows.net,1433? Просто добавьте туда номер порта.

Priyank Panchal 25.01.2023 05:20

Мои извинения, некоторая путаница с моей стороны. У меня есть 2 разные строки подключения. Для первоначального подключения к Azure в обозревателе SQL Server используется эта строка подключения; Источник данных = beaconsqlsql.database.windows.net; Исходный каталог = MRP2; Идентификатор пользователя = beaconadmin; Пароль =********; Время ожидания подключения = 30; Шифрование = True; TrustServerCertificate = False; ApplicationIntent = ReadWrite‌ ​;MultiSubnetFailover‌​=False

P. Szk. 25.01.2023 05:41

Для фактического подключения к базе данных код C# и обозреватель SQL Server используют строку подключения, предоставленную Azure; Server=tcp:beaconsqlsql.database.windows.net,1433;Исходный каталог=MRP2;Постоянная информация о безопасности=False;Идентификатор пользователя=beaconadmin;Пароль=********;MultipleActiveResultSets=Fa‌​lse;Encrypt=True ;Tru‌​stServerCertificate=‌​False;Время ожидания подключения=30;

P. Szk. 25.01.2023 05:42

Я могу попасть на конечную точку вашего сервера Azure (хотя мой IP-адрес отклонен, как и ожидалось). Я подозреваю, что у вас проблемы с брандмауэром

Mitch Wheat 25.01.2023 06:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
114
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Я создал одну базу данных Azure SQL и разрешил IP-адрес моего клиента, как показано ниже:

Я создал одно консольное приложение .Net и запустил ваш код, я заменил

using System.Data.SqlClient

с

using Microsoft.Data.SqlClient

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

Строка подключения, скопированная с портала Azure > SQL-сервер Azure > Строка подключения, см. ниже: —

Код С#: -

using System;
using System.Linq.Expressions;
using Microsoft.Data.SqlClient;

namespace AzureSql2
{
    class Program
    {
        static void Main(string[] args)
        {
            string connStr = "Server=tcp:sqlservername.database.windows.net,1433;Initial Catalog=sqldbname;Persist Security Info=False;User ID=username;Password=password;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;";
            Console.WriteLine("Building connection");
            try
            {
                using (var conn = new SqlConnection(connStr))
                {
                    Console.WriteLine("Creating command");
                    using (var command = conn.CreateCommand())
                    {
                        command.CommandText = "SELECT * FROM Products";

                        Console.WriteLine("Opening connection");
                        conn.Open();

                        Console.WriteLine("Reading database");
                        using (var reader = command.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                Console.WriteLine("Record count: {0}", reader.GetInt32(0));
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception: " + ex.Message);
            }

            Console.WriteLine("Press Enter to exit");
            Console.ReadLine();
        }
    }
}

Выход :-

Я попытался запустить код с форматом строки подключения, который вы упомянули в комментариях: -

Data Source=azuresqlservername.database.windows.net;Initial Catalog=databasename;User ID=siliconuser;Password=password;Connect Timeout=30;Encrypt=True;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False 

И я смог запустить тот же код выше и получил желаемый результат: -

Когда я попытался изменить имя сервера Azure SQL в строке подключения, я получил тот же код ошибки, что и ваш, см. ниже: -

Убедитесь, что в строке подключения отсутствует какой-либо синтаксис, и проверьте его на портале Azure.

Что ж, это странно. Я изменил код, чтобы использовать Microsoft.Data.SqlClient (добавив пакет Microsoft.Data.SqlClient NuGet). Вот и все - только одно изменение. И это сработало! Приложение подключилось и вернуло значение 0 для количества записей...

P. Szk. 25.01.2023 14:44

Я продолжил свой счастливый танец по комнате, радуясь, что это, наконец, сработало. Затем я попытался запустить его снова. С тех пор не работает. Каждый раз возвращаюсь к одной и той же ошибке. Любые другие предложения?

P. Szk. 25.01.2023 14:49

Вы проверили правильность имени SQL Server и всей строки подключения? И не пропускает ли какой-либо синтаксис или добавляет ли какая-либо дополнительная строка?

SiddheshDesai 25.01.2023 14:54

Да, я пытался использовать как строку подключения, предоставленную Azure, так и версию, используемую SQL Server Explorer. Оба дают одну и ту же ошибку.

P. Szk. 25.01.2023 15:25

Строка подключения, скопированная из Azure: Server=tcp:beaconsqlsql.database.windows.net,1433;Initial Catalog=MRP2;Persist Security Info=False;ID пользователя=beaconadmin;Password = {your_password};MultipleActiveResult‌​Sets=False;Encrypt =T‌​rue;TrustServerCerti‌​ficate=False;Connect‌​ion Timeout=30; Строка подключения, используемая SQL Server Explorer (успешно): Источник данных = beaconsqlsql.database.windows.net; Исходный каталог = MRP2; Идентификатор пользователя = beaconadmin; Пароль = **********; Время ожидания подключения = 30; Шифрование =True;TrustServerCertificate=False;Application‌​tionIntent=ReadWrite‌​;MultiSubnetFailover‌​=False

P. Szk. 25.01.2023 15:25

beaconsqlsql 'sql' повторяется два раза? Это имя вашего сервера Azure SQL?

SiddheshDesai 25.01.2023 17:16

В итоге я взял копию проекта домой и запустил ее на своем домашнем ПК, и она работала правильно и надежно (после того, как я сказал Azure разрешить этот IP-адрес).

Оказалось, что ответ был до неловкости очевиден — в дополнение к стандартному брандмауэру Windows 10 на моем рабочем ПК установлено другое программное обеспечение для защиты от вирусов / брандмауэра, и его также нужно было разрешить приложению.

Определенно один, чтобы помнить в следующий раз ... Хотя я немного заинтригован тем, что в двух случаях (один раз упоминалось выше, один раз позже) из нескольких сотен попыток приложению удалось пройти и подключиться.

Всем спасибо за ответы и помощь.

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