Ошибка MSSQL «Основной поставщик не удалось открыть»

220

Я использовал .mdfдля подключения к databaseи entityClient. Теперь я хочу изменить строку подключения, чтобы не было .mdfфайла.

Правильно ли следующее connectionString?

<connectionStrings>
   <!--<add name="conString" connectionString="metadata=res://*/conString.csdl|res://*/conString.ssdl|res://*/conString.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.\SQL2008;AttachDbFilename=|DataDirectory|\NData.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />-->
   <add name="conString" connectionString="metadata=res://*/conString.csdl|res://*/conString.ssdl|res://*/conString.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.\SQL2008;Initial Catalog=NData;Integrated Security=True;Connect Timeout=30;User Instance=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

Потому что я всегда получаю ошибку:

Основной поставщик не удалось открыть

senzacionale
источник
2
У меня та же проблема, когда я пытаюсь работать под IIS. Если я запускаю VS Server, я не получаю ошибки.
Zote
11
У меня была та же проблема, и я удалил ее Integrated Securityиз строки подключения, создал пользователя и убедился, что у него есть sysadminразрешения, и добавил этого пользователя в строку подключения.
Фульвио
где находится ваша БД, если она находится в приложении, размещенном на IIS, вы должны поместить свою БД в папку App_Data и отредактировать строку подключения, сгенерированную моделью Entityframework, чтобы найти ее там. stackoverflow.com/questions/9809442/…
Эран Отзап
У меня была эта проблема, и она была решена путем вставки пароля в строку подключения.
satyrFrost
Простое удаление Integrated Security работало для меня при работе под IIS
Jon

Ответы:

215

У меня была эта ошибка и я нашел несколько решений:

Глядя на строку подключения, она выглядит действительной. Я нашел это сообщение в блоге , проблема здесь в том, что они использовали встроенную безопасность . Если вы работаете в IIS, вашему пользователю IIS необходим доступ к базе данных.

Если вы используете Entity Framework с транзакциями , Entity Framework автоматически открывает и закрывает соединение с каждым вызовом базы данных. Поэтому при использовании транзакций вы пытаетесь распределить транзакцию по нескольким соединениям. Это повышается до MSDTC .

( См. Эту ссылку для получения дополнительной информации. )

Изменение моего кода на следующее исправило это:

using (DatabaseEntities context = new DatabaseEntities())
{
    context.Connection.Open();
    // the rest
}
Кристиан Пейн
источник
7
Как это сделать при использовании Linq для доступа к таблицам (используя EF4)?
Бретт Ригби
2
@Brett Rigby: stackoverflow.com/questions/794707/… описывает, как это сделать с помощью Linq / EF.
Скотт Стаффорд
63
Если вы используете EF / DBContext, то правильный вызов - context.Database.Connection.Open ();
живи-люби
2
Хотелось бы, чтобы я прочитал ваш пост, а не просматривал код, когда впервые его нашел. Моя проблема (как указано в этом ответе) заключалась в том, что пользователь AppPool для контекста плагина CRM 2011 не имел доступа для записи в базу данных, которую я настроил. Когда я добавил пользователя в SQL, плагин работал как шарм.
Mike_Matthews_II
2
У меня не было строки подключения в моей конфигурации, названной в соответствии с контекстом, который я создавал ....... проверьте это также.
Билл Бланкеншип
38

context.Connection.Open() не помогло решить мою проблему, поэтому я попытался включить «Разрешить удаленных клиентов» в конфигурации DTC, больше никаких ошибок.

В windows 7 вы можете открыть конфигурацию DTC, выполнив команду dcomcnfg, Службы компонентов -> Компьютеры -> Мой компьютер -> Координатор распределенных транзакций -> Щелкните правой кнопкой мыши локальный код неисправности -> Безопасность.

Керем
источник
11
В Windows 7 вы можете открыть конфигурацию DTC, выполнив команду dcomcnfg , Службы компонентов -> Компьютеры -> Мой компьютер -> Координатор распределенных транзакций -> Щелкните правой кнопкой мыши локальный код неисправности -> Безопасность.
Керем
7
На самом деле это правой кнопкой мыши локальный код неисправности -> Свойства -> Безопасность
Отто Abnormalverbraucher
27

Вы должны увидеть innerException, чтобы увидеть, какова внутренняя причина возникновения ошибки.

В моем случае исходная ошибка была:

Невозможно открыть физический файл "D: \ Projects2 \ xCU \ xCU \ App_Data \ xCUData_log.ldf". Ошибка операционной системы 5: «5 (доступ запрещен.)». Попытка присоединить базу данных с автоматическим именем для файла D: \ Projects2 \ xCU \ xCU \ App_Data \ xCUData.mdf не удалась. База данных с тем же именем существует, или указанный файл не может быть открыт, или он находится на общем ресурсе UNC.

что решается путем предоставления полного разрешения текущему пользователю для доступа к связанным mdfи ldfфайлам, используя свойства файлов.

Маджид
источник
24

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

SERVER\SQLEXPRESS
SERVER

Когда на самом деле я должен иметь:

.\SQLEXPRESS

По какой-то причине я получаю сообщение об ошибке всякий раз, когда возникают трудности с поиском экземпляра SQL.

dooburt
источник
6
Это может быть связано с тем, что у вас не включены именованные каналы в качестве метода подключения для SQL Server.
Пол
1
@ Пол, спасибо. Вероятно, это была новая установка SQL, которая разворачивается с отключенными именованными каналами. Спасибо за хедз-ап. +1
доубурт
1
Спасибо за это, у меня была эта проблема из-за отключения именованных каналов.
Патрик Оллвуд
15

Это общая проблема только. Даже я сталкивался с этой проблемой. На компьютере разработчика, настроенном с аутентификацией Windows, он работает отлично:

<add name="ShoppingCartAdminEntities" connectionString="metadata=res://*/ShoppingCartAPIModel.csdl|res://*/ShoppingCartAPIModel.ssdl|res://*/ShoppingCartAPIModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.\SQlExpress;initial catalog=ShoppingCartAdmin;Integrated Security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />

После размещения в IIS с той же конфигурацией я получил эту ошибку:

Основной поставщик не удалось открыть

Было решено изменение connectionStringв файле конфигурации:

<add name="MyEntities" connectionString="metadata=res://*/ShoppingCartAPIModel.csdl|res://*/ShoppingCartAPIModel.ssdl|res://*/ShoppingCartAPIModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=MACHINE_Name\SQlExpress;initial catalog=ShoppingCartAdmin;persist security info=True;user id=sa;password=notmyrealpassword;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />

Другие распространенные ошибки могут быть:

  1. Служба базы данных может быть остановлена
  2. Атрибуты источника данных, указывающие на локальную базу данных с аутентификацией Windows и размещенные в IIS
  3. Имя пользователя и пароль могут быть неверными.
JaiSankarN
источник
Для меня проблема заключалась в том, что когда я создавал модель данных EF, она создала строку подключения, которая использует данные для входа из Data Connections в VS. В строке подключения не указан ни один пользователь или пароль, поэтому удалите Integrated Security=Trueи замените его, user id=sa;password=notmyrealpasswordчтобы устранить эту проблему развертывания.
LostNomad311
10

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

Независимо от того, используете ли вы Integrated Security (контекст зарегистрированного пользователя Windows) или отдельную учетную запись SQL, убедитесь, что у пользователя есть надлежащий доступ в разделе «Безопасность» к базе данных, к которой вы пытаетесь получить доступ, чтобы предотвратить эту проблему.

atconway
источник
У меня та же проблема, что и в оригинальном сообщении, я проверил свое имя хоста и во внутреннем исключении проверил, что я использую правильное имя пользователя. Безопасность пользователей SSMS выглядит правильно - учетная запись SQL Server настроена правильно и имеет открытый доступ к базе данных. Но войти не удалось.
коды с молотком
В чем состоит inner exceptionгосударство? Это был мой ответ, что он предоставит скрытые дополнительные детали, необходимые для понимания истинной основной проблемы. Не inner exceptionбудет проверять, что у вас есть правильный вход в систему - это исключение, а не разъяснение.
atconway
Login failed for user 'user'.
Коды с молотком
Я также попытался добавить NT AUTHORITY\NETWORK SERVICEв список пользователей SQL Server. Я все еще получил тот же отклоненный сбой входа в систему.
Коды с молотком
Решаемые. Мне нужно было перейти data sourceна hostname\SQLEXPRESS. Я пробовал hostnameи .\SQLEXPRESSранее. Тогда я смог подключиться с интегрированной безопасностью. Любопытно, что это противоположно ответу Дубурта . Любопытно, что имя пользователя SQL Server не удалось подключиться из Visual Studio.
коды с молотком
6

У меня была похожая проблема с SQL Server Express Edition на Windows Server 2003 . Я просто добавил сетевой сервис как пользователь в базу данных безопасности.

Par6
источник
4
Можете ли вы описать, как вы это делаете?
Питер Мортенсен
4

Служба SQL Server Express не была запущена автоматически.

1) Перейти на панель управления 2) Администрирование 3) Сервис 4) Установить автоматический запуск SQL Server, нажав на него 5) Щелкните правой кнопкой мыши и запустите службу

Я надеюсь, что это поможет.

user2033790
источник
3

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

Чтобы исправить этот прогон:

USE your_database
EXEC sp_change_users_login 'Auto_Fix', 'user', NULL, 'cf'
GO
EXEC sp_change_users_login 'update_one', 'user', 'user'
GO
79E09796
источник
Абсолютно в этом была проблема. Я только что восстановил из резервной копии. Возьмите взгляд на детали анализа.
nesimtunc
2

Я опубликовал похожую проблему здесь, работая с базой данных SQL 2012, размещенной на Amazon RDS. Проблема была в строке подключения - там были свойства «Имя приложения» и «Приложение» . Как только я удалил их, все заработало.

Entity Framework 5 и Amazon RDS - «Основной поставщик не удалось открыть».

wloescher
источник
2

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

Раджеш
источник
1

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

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

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

Джеймс Уилкинс
источник
Это то, что сделал это для меня тоже. Кажется, если вы пометите это как статическое, это вызовет всевозможные проблемы с экземпляром, с которым он пытается работать.
Майкл Дж. Грей
1

У меня была та же проблема, но что работало для меня, так это удаление этой строки подключения:

persist security info=True

FV01
источник
1

У меня была похожая ошибка с внутренним исключением, как показано ниже:

операция недействительна для состояния транзакции

Я мог бы решить это, включив настройки безопасности DTC.

Перейти к свойствам DTC, под вкладкой Безопасность, проверьте ниже

  • Доступ по сети DTC
  • Разрешить RemoteClients
  • Менеджер транзакций
  • Разрешить входящий
  • Разрешить исходящий
sparhea
источник
1

Если вы столкнулись с этой ошибкой в ​​веб-приложении ASP.NET, помимо прочего, отметьте следующее:

  1. Разрешения безопасности пользователя базы данных (каким пользователям разрешен доступ к вашей базе данных.
  2. Проверьте пул приложений в IIS и убедитесь, что это правильный доступ к вашей базе данных.
AlexK
источник
1

Я избавился от этого, сбросив IIS , но все еще используя Integrated Authenticationв строке подключения.

Рави Тиагараджан
источник
1

Определение нового правила брандмауэра Windows для SQL Server (и для порта 1433) на компьютере сервера решает эту ошибку (если ваше имя сервера, имя пользователя или пароль не указаны в строке подключения ...).

Гекхан Йылмаз
источник
0

Распространенная ошибка, которую я совершил, потому что я переносил приложение с одного компьютера на другой, и ничего из вышеперечисленного не работало, заключался в том, что я забыл скопировать строку подключения в App.Config и Web.Config!

rikket
источник
0

У меня была похожая проблема: в моих тестовых примерах я всегда получал эту ошибку. Я обнаружил, что моя «Служба распределенных транзакций» не была запущена (запустите: services.msc -> start «Служба распределенных транзакций» (лучше всего настроить ее на автоматический запуск)). После того, как я это сделал, это сработало как шарм ...

Ибер
источник
0

Я скопировал файлы базы данных (.mdf / .ldf) в папку App_Data, чтобы избавиться от этого исключения.

MDC
источник
0

Я также столкнулся с той же проблемой. Теперь я сделал это, удалив имя пользователя и пароль из строки подключения.

user2650536
источник
0

Для меня это была просто простая ошибка:

Я использовал Amazon EC2 и использовал свой эластичный IP-адрес в строке подключения, но когда я изменил IP-адреса, я забыл обновить строку подключения.

Эрез Робинсон
источник
0

У меня была такая ошибка, неожиданно возникшая на ровном месте на одном из наших сайтов. В моем случае оказалось, что срок действия пароля пользователя SQL истек! Сняв флажок истечения срока действия пароля в SQL Server Management Studio, добились цели !

Коннелл
источник
0

У меня была такая же проблема несколько дней назад, с использованием "Integrated Security = True;" в строке подключения вам нужно запустить удостоверение пула приложений в «localsystem». Конечно, это не рекомендуется, но для тестирования это делает свою работу.

Вот как вы можете изменить удостоверение в IIS 7: http://www.iis.net/learn/manage/configuring-security/application-pool-identities

Габриель
источник
0

В IIS установите для идентификатора пула приложений учетную запись пользователя службы, учетную запись администратора или учетную запись ant, у которой есть разрешение на выполнение операций с этой базой данных.

Джейдип шил
источник
0

В моем случае у меня было несоответствие между именем строки подключения, которое я регистрировал в конструкторе контекста, и именем в моем web.config. Простая ошибка, вызванная копированием и вставкой: D

    public DataContext()
        : base(nameOrConnectionString: "ConnStringName")
    {
        Database.SetInitializer<DataContext>(null);
    }

dEVmARCO
источник
0

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

Хамза Яхья
источник
0

У меня также была эта ошибка, если имя экземпляра SQL Server не указано и на хосте SQL установлено несколько экземпляров SQL. Вот пара примеров для пояснения:

Приведенная ниже строка подключения приводит к исключению «Основной поставщик не удалось открыть» без внутреннего исключения в приложении .NET WebForms:

 connectionString="metadata=res://*/Entities.csdl|res://*/Entities.ssdl|res://*/Entities.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=localhost;Initial Catalog=Entities;User ID=user;Password=password;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient"

Следующая строка подключения выполняется, как и ожидалось, в приложении .net WebForms, где среда SQL имеет несколько экземпляров. Редко я знаю, но у меня есть несколько разных экземпляров SQL на моем компьютере разработчика для разных проектов:

 connectionString="metadata=res://*/Entities.csdl|res://*/Entities.ssdl|res://*/Entities.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=localhost\SQLSERVER2014;Initial Catalog=Entities;User ID=user;Password=password;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient"
Сэм Эллис
источник
0

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

Али Садри
источник
0

У меня была эта проблема, потому что имя входа в пул приложений, под которым работало это приложение, изменилось.

В IIS:

  • Найдите пул приложений, нажав на свой сайт и перейдя в раздел «Основные настройки».

  • Перейдите в пулы приложений.

  • Нажмите на пул приложений вашего сайта.

  • Нажмите на Дополнительные настройки.

  • В удостоверении введите логин и пароль учетной записи.

  • Перезапустите свой сайт и попробуйте снова.

живи любя
источник