Я пытаюсь подключиться к образцу базы данных, созданному в 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#, но я не вижу никаких различий между ним и примерами, которые я просматривал.
Вы читали что-нибудь вроде mderriey.com/2020/07/17/… ?
Да, таблица действительно называется «таблица» — база данных — это просто базовый эксперимент с одной таблицей. Ошибка возникает при первом открытии соединения, поэтому я бы подумал, что имя таблицы в этот момент не имеет значения (?). Строка подключения: Источник данных = beaconsqlsql.database.windows.net; Исходный каталог = MRP2; Идентификатор пользователя = beaconadmin; Пароль = *********; Время ожидания подключения = 30; Шифрование = True; TrustServerCertificate = False; Приложение tionIntent=ReadWrite;MultiSubnetFailover=False
Я не уверен, что это сработает, но не могли бы вы попробовать изменить источник данных на beaconsqlsql.database.windows.net,1433? Просто добавьте туда номер порта.
Мои извинения, некоторая путаница с моей стороны. У меня есть 2 разные строки подключения. Для первоначального подключения к Azure в обозревателе SQL Server используется эта строка подключения; Источник данных = beaconsqlsql.database.windows.net; Исходный каталог = MRP2; Идентификатор пользователя = beaconadmin; Пароль =********; Время ожидания подключения = 30; Шифрование = True; TrustServerCertificate = False; ApplicationIntent = ReadWrite ;MultiSubnetFailover=False
Для фактического подключения к базе данных код C# и обозреватель SQL Server используют строку подключения, предоставленную Azure; Server=tcp:beaconsqlsql.database.windows.net,1433;Исходный каталог=MRP2;Постоянная информация о безопасности=False;Идентификатор пользователя=beaconadmin;Пароль=********;MultipleActiveResultSets=False;Encrypt=True ;TrustServerCertificate=False;Время ожидания подключения=30;
Я могу попасть на конечную точку вашего сервера Azure (хотя мой IP-адрес отклонен, как и ожидалось). Я подозреваю, что у вас проблемы с брандмауэром





Я создал одну базу данных 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 для количества записей...
Я продолжил свой счастливый танец по комнате, радуясь, что это, наконец, сработало. Затем я попытался запустить его снова. С тех пор не работает. Каждый раз возвращаюсь к одной и той же ошибке. Любые другие предложения?
Вы проверили правильность имени SQL Server и всей строки подключения? И не пропускает ли какой-либо синтаксис или добавляет ли какая-либо дополнительная строка?
Да, я пытался использовать как строку подключения, предоставленную Azure, так и версию, используемую SQL Server Explorer. Оба дают одну и ту же ошибку.
Строка подключения, скопированная из Azure: Server=tcp:beaconsqlsql.database.windows.net,1433;Initial Catalog=MRP2;Persist Security Info=False;ID пользователя=beaconadmin;Password = {your_password};MultipleActiveResultSets=False;Encrypt =True;TrustServerCertificate=False;Connection Timeout=30; Строка подключения, используемая SQL Server Explorer (успешно): Источник данных = beaconsqlsql.database.windows.net; Исходный каталог = MRP2; Идентификатор пользователя = beaconadmin; Пароль = **********; Время ожидания подключения = 30; Шифрование =True;TrustServerCertificate=False;ApplicationtionIntent=ReadWrite;MultiSubnetFailover=False
beaconsqlsql 'sql' повторяется два раза? Это имя вашего сервера Azure SQL?
В итоге я взял копию проекта домой и запустил ее на своем домашнем ПК, и она работала правильно и надежно (после того, как я сказал Azure разрешить этот IP-адрес).
Оказалось, что ответ был до неловкости очевиден — в дополнение к стандартному брандмауэру Windows 10 на моем рабочем ПК установлено другое программное обеспечение для защиты от вирусов / брандмауэра, и его также нужно было разрешить приложению.
Определенно один, чтобы помнить в следующий раз ... Хотя я немного заинтригован тем, что в двух случаях (один раз упоминалось выше, один раз позже) из нескольких сотен попыток приложению удалось пройти и подключиться.
Всем спасибо за ответы и помощь.
Ваш стол действительно называется "стол"? Пожалуйста, поделитесь запутанной строкой подключения к Azure.