Проблема с подключением к SQL Серверу Express из C# кода - PullRequest
2 голосов
/ 05 марта 2020

У меня есть программа, которая подключается к SQL экземпляру базы данных сервера по умолчанию. Я подключаюсь к базе данных, используя Entity Framework, и программное обеспечение теперь используется как производственное программное обеспечение - оно очень хорошо поддерживает мой бизнес. Это платная версия SQL Сервер, работающий на Windows Server 2012.

Я проверил тот же код из git дома и надеюсь работать на том же программном обеспечении дома. Я установил SQL Сервер Express на своем P C (и фактически, для целей тестирования на втором P C в сети). Я использую строку подключения, непосредственно скопированную из SQL Обозреватель объектов сервера:

@"Data Source=TSORT\SQLEXPRESS;Initial Catalog=CN2;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False";

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

Моя процедура установки успешно создает базу данных дома на моем SQL Server Express именованном экземпляре. Я вижу базу данных и таблицы, включая таблицу __MigrationHistory, которая содержит правильную ревизию.

Однако при запуске этого кода:

CN2.Data.Model.CN2Context context = new Data.Model.CN2Context(builder.ConnectionString);

context.Database.Delete();
context.Database.Create();
var dbMigrator = new System.Data.Entity.Migrations.DbMigrator(new AJSoft.CN2.Model.Migrations.Configuration());
dbMigrator.Update();
context.SaveChanges();

И когда я впоследствии пытаюсь подключиться к базе данных, используя ту же строку подключения, я получаю известную ошибку generi c :

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

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

Основное различие на работе (SQL Сервер) и дома (SQL Сервер Express) заключается в том, что на работе я использую экземпляр по умолчанию, а дома использую именованный экземпляр (COMPUTERNAME\SQLEXPRESS). Все клиенты P C Windows 10 и постоянно обновляются.

Это явно невероятно расстраивает, так как это означает, что я не могу работать с программным обеспечением на моем домашнем компьютере P C. Любые советы приветствуются.

Редактировать: Для справки: строка подключения, которую я использую в моей отладочной сборке на работе (без проблем):

Для справки, строка подключения, которую я использую для моей отладочной сборки в моей доменной среде на работе:

"Data Source=ROHAN;Initial Catalog=\"CN2 Test\";Integrated Security=True;Connect Timeout=10;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"

Где ROHAN - это, очевидно, имя моего сервера, и как вы видите, используется экземпляр по умолчанию.

РЕДАКТИРОВАТЬ: кажется, у меня есть более фундаментальная проблема где-то в моем коде. Я получаю точно ту же проблему, указав LocalDb - база данных создана, но как только она была создана, я не могу подключиться к ней снова. Я продолжу расследование. До этого я использую TeamViewer для разработки из дома.

Ответы [ 3 ]

0 голосов
/ 11 марта 2020

Две вещи, которые нужно попробовать: 1. Укажите протокол и порт для сервера, как в: Источник данных = tcp: TSORT, 1433; 2. Укажите IP-адрес вместо имени сервера, как в: Источник данных = tcp: xxx.xxx.xxx.xxx, 1433;

Подключение напрямую к порту устраняет необходимость иметь браузер SQL служба работает на вашем сервере БД.

0 голосов
/ 12 марта 2020

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

Я принял BreukAJ как окончательный ответ, потому что по любой другой причине это было бы были правильными.

На очень ранней стадии тестирования проекта я создал конструктор для своего класса CN2Context, помеченного #ifdef DEBUG. Этот беспараметрический конструктор затем вызывал дополнительный конструктор с жестко закодированной строкой соединения. Это позволило мне подключиться к базе данных от дизайнера WPF, что было полезно на самых ранних этапах проекта. Это было 7 лет go и стало очевидным только после того, как я перешел на другую машину для разработки с новым SQL сервером.

Я прошу прощения у всех, кто потратил время и силы на решение этой проблемы, который сейчас решен ...

0 голосов
/ 07 марта 2020

Вы говорите, что проверили, что TCP / IP включен локально и в сети ... так что вы на 100% уверены, что IP-адрес, по которому вы пытаетесь достичь его (не 127,0. Адрес 0.1) включен? С каким портом связан TCP / IP для вашего экземпляра SQL Express? Если он не привязан к стандартному порту (1433) или включены порты Dynami c, вам необходимо убедиться, что служба браузера SQL работает на сервере, чтобы клиент знал, к какому порту подключаться чтобы достичь этого именованного экземпляра ... поэтому, пожалуйста, убедитесь, что эта служба запущена.

Настройка SQL сервера для прослушивания через конкретный порт c TCP

О SQL Службе обозревателя серверов

...