none
В Vs2017 в ASP.NET не могу получить доступ к базам SQL Server RRS feed

  • Вопрос

  • Здравствуйте. Всех с наступающим Новым годом.

    Работал в VS2010 с SQL Server 2008. Перехожу на Vs2017 и установил SQL Server Express 2012. СайтыASP.Net в Vs2010 продолжают запускаться. В Vs2017  при попытке обращения к серверу возникает ошибка

    "System.Data.SqlClient.SqlException (0x80131904):
     Не удалось сформировать пользовательский экземпляр SQL Server
     из-за ошибки при запуске процесса для экземпляра пользователя.
     Соединение будет закрыто ..."

    Решил попробовать присоединить базу в папке "App_Data" сайта. Север SQL не может пробиться к папке проекта. Вынес сайт в корень диска С. При отладке в VS2017 вижу туже ошибку. пробую присоединить базу к SQL серверу. В папку "App_Data" попадаю. Вижу файл, выбираю. При нажатии кнопки "Ok". возникает ошибка

    "Не удалось открыть физический файл …. отказано в доступе".

    Ясно, что надо дать доступ SQL. Лезу в свойства, безопасность, дохожу дохожу до "поиск" и не вижу ничего, чтобы я мог ассоциировать с SQL 2012.  Смотрю свойство безопастность папки "App_Data" VS2010. Ассоциировать с SQL могу только "SQL Server 2005 SQLBrowser…..". Очень удивляюсь, но пробую добавить папке  "App_Data" сайта VS2017 эту запись и дать ей полный доступ.

    Пытаюсь запустить в отладке сайт или присоедитеь его к базе. Ничего не изменилось. Для чистоты эксперимента создаю в SQL новую базу. Заполняю данными. (естественно новое имя уникально) Копирую в "App_Data" сайта VS2010. Удаляю базу в SQL. Проверяю - ничего не изменилось.

    Ясно, надо чему-то дать доступ к папке "App_Data", но чему и как?

    Кроме того, возможно, изменился синтаксис строки "connectionStrings" как был в VS 2010:

    <connectionStrings>

        <addname="Test1"connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Web2017\Test1\App_Data\TestWeb2017.mdf;Integrated Security=True;User Instance=True"providerName="System.Data.SqlClient"/>   

      </connectionStrings>

    Может быть это уже неправильно?

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

    Помогите, пожалуйста

      
    29 декабря 2018 г. 3:45

Ответы

  • Я предлагаю избавиться от User Instance. Во первых, эта технология устарела, во вторых, она вообще на мой взгляд не очень полезна. Используйте LocalDB, если вам действительно нужен подобный функционал в новых версиях SQL Server.
    • Помечено в качестве ответа Miklv 3 января 2019 г. 11:19
    29 декабря 2018 г. 9:21
  • Выдать права на доступ к папке учетной записи, под которой работает SQL Server. Ее можно посмотреть в Диспетчере конфигурации SQL Server в свойствах службы, по умолчанию это вроде Network Service. Если база находится в корне диска, скорее всего, вам также придется запускать приложение с повышенными привилегиями UAC.

    Кроме того, вы используете параметр AttachDbFilename, который открывает файл базы в монопольном режиме. Это значит, что вы не можете одновременно открыть базу и в программе, и в SQL Server management Studio. Обычно рекомендуется не использовать AttachDbFilename, а присоединять базу вручную через SQL Server management Studio, и подключаться, указывая ее как параметр InitialCatalog

    • Помечено в качестве ответа Miklv 3 января 2019 г. 11:19
    29 декабря 2018 г. 14:59
  • Строка соединения в обоих случаях точно одинаковая и без User Instance? То, что вы описываете (в обычном приложении одно, а в веб-сайте другое) как раз очень похоже на симптомы User Instance. 

    Никаких диалектов TSQL, насколько я знаю, не существует. Более того, у вас простейший запрос, который почти соответствует стандартному SQL, за исключением наличия схемы. Если он завершается с ошибкой, значит в текущем контексте не видна либо схема dbo, либо таблица test. Добавление явного указания на базу что нибудь меняет? Покажите результат запроса 

    SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'

    из-под веб сайта

    • Помечено в качестве ответа Miklv 3 января 2019 г. 11:19
    1 января 2019 г. 8:09
  • Попробуйте вторую базу тоже присоединить к SQL Server (с другим именем, разумеется) и подключаться к ней так же через Initial Catalog. AttachDbFilename все же заточен под User Instance в старых версиях SQL Server Express, как он работает в новых версиях SQL Server, если честно не знаю, возможно вообще не работает...

    "Вы предложили интересный запрос, но я никак не соображу как реализовать чтение ответа на этот вопрос в C#"

    Например так:

    var dt = new DataTable();
    
    using (var adapter = new System.Data.SqlClient.SqlDataAdapter("SELECT ...", connection))
    {
        adapter.Fill(dt);
    }
    
    StringBuilder sbResult = new StringBuilder();
    
    foreach (DataRow dataRow in dt.Rows)
    {
      foreach (var item in dataRow.ItemArray)
      {
        sbResult.Append(item.ToString()+"; ");
      }
      sbResult.AppendLine();
    }
    Потом sbResult.ToString() выводите куда нибудь в HTML, чтобы посмотреть его

    • Помечено в качестве ответа Miklv 3 января 2019 г. 11:19
    2 января 2019 г. 9:51

Все ответы

  • Я предлагаю избавиться от User Instance. Во первых, эта технология устарела, во вторых, она вообще на мой взгляд не очень полезна. Используйте LocalDB, если вам действительно нужен подобный функционал в новых версиях SQL Server.
    • Помечено в качестве ответа Miklv 3 января 2019 г. 11:19
    29 декабря 2018 г. 9:21
  • Большое спасибо. Ваш ответ- шаг вперед. Диагностика при присоединения базы к SQL server и при обращении внутри сайта к SQL-server стали совпадать: "Нет доступа к физическому файлу". Осталось вторая часть вопроса как открыть доступ. Извините, пока не помечаю как ответ, так как после этого, если я правильно понимаю правила, тема будет закрыта.
    29 декабря 2018 г. 13:25
  • Выдать права на доступ к папке учетной записи, под которой работает SQL Server. Ее можно посмотреть в Диспетчере конфигурации SQL Server в свойствах службы, по умолчанию это вроде Network Service. Если база находится в корне диска, скорее всего, вам также придется запускать приложение с повышенными привилегиями UAC.

    Кроме того, вы используете параметр AttachDbFilename, который открывает файл базы в монопольном режиме. Это значит, что вы не можете одновременно открыть базу и в программе, и в SQL Server management Studio. Обычно рекомендуется не использовать AttachDbFilename, а присоединять базу вручную через SQL Server management Studio, и подключаться, указывая ее как параметр InitialCatalog

    • Помечено в качестве ответа Miklv 3 января 2019 г. 11:19
    29 декабря 2018 г. 14:59
  • Здравствуйте. Всех поздравляю с Новым 2019г. Всем здоровья, счастья и всего наилучшего. Особые поздравления VadimTagil, помогшему сделать второй шаг в решении проблемы. Именно его подсказки позволил мне сделать второй шаг к решению проблемы: SQL сервер получил доступ к базе данных!

    И тут меня поджидает неожиданная западня. В простейшем запросе

    " SELECT        Id, Name    FROM  dbo.Test "

    возникает ошибка

    "System.Data.SqlClient.SqlException (0x80131904): Недопустимое имя объекта \"dbo.Test\".\r\n"

    создаю идентичное представление в базе. Запускаю работает. Копирую текст запроса на сайт, запускаю - ошибка.

    Решаю начать новую жизнь - делаю новый проект. Выбираю другой шаблон

    Извините, что Вас мучал, но в этом шаблоне доступ к базе открылся сразу без настоек доступа. Запускаю -  ошибка такая же

    "System.Data.SqlClient.SqlException (0x80131904): Недопустимое имя объекта \"dbo.Test\".\r\n"

    Делаю проект Windows Form. В него копирую текст кода, обращающегося к базе без каких-либо изменений. Запускаю - все работает. Ошибки нет!

    Получается, что в использованных шаблонах Web используется другой диалект TSQL.

    И что делать дальше?

    Помогите, пожалуйста Динозавру

    1 января 2019 г. 7:46
  • Строка соединения в обоих случаях точно одинаковая и без User Instance? То, что вы описываете (в обычном приложении одно, а в веб-сайте другое) как раз очень похоже на симптомы User Instance. 

    Никаких диалектов TSQL, насколько я знаю, не существует. Более того, у вас простейший запрос, который почти соответствует стандартному SQL, за исключением наличия схемы. Если он завершается с ошибкой, значит в текущем контексте не видна либо схема dbo, либо таблица test. Добавление явного указания на базу что нибудь меняет? Покажите результат запроса 

    SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'

    из-под веб сайта

    • Помечено в качестве ответа Miklv 3 января 2019 г. 11:19
    1 января 2019 г. 8:09
  • Здравствуйте. Большое спасибо VadimTagil, что Вы уделяете столько внимания моим вопросам.

    Есть две копии одного и того же файла базы SQL. Одна лежит в папке "App_Data" сайта, а вторая в папке баз данных SQL и присоединена к SQL.

    Строка подключения на сайте

     <add name="TestWeb" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Web2017\Test1\App_Data\TestWeb2017.mdf;Integrated Security=True;" providerName="System.Data.SqlClient"/>   

    строка подключения на Windows Form

     string conStr = @"Data Source=localhost\SQLEXPRESS;Initial Catalog=TestWeb2017;Integrated Security=True";

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

    Вы предложили интересный запрос, но я никак не соображу как реализовать чтение ответа на этот вопрос в C#. Обычно я использую dataReader.Getтип_данных. Как прочитать ответ в этом случае?

    2 января 2019 г. 8:55
  • Попробуйте вторую базу тоже присоединить к SQL Server (с другим именем, разумеется) и подключаться к ней так же через Initial Catalog. AttachDbFilename все же заточен под User Instance в старых версиях SQL Server Express, как он работает в новых версиях SQL Server, если честно не знаю, возможно вообще не работает...

    "Вы предложили интересный запрос, но я никак не соображу как реализовать чтение ответа на этот вопрос в C#"

    Например так:

    var dt = new DataTable();
    
    using (var adapter = new System.Data.SqlClient.SqlDataAdapter("SELECT ...", connection))
    {
        adapter.Fill(dt);
    }
    
    StringBuilder sbResult = new StringBuilder();
    
    foreach (DataRow dataRow in dt.Rows)
    {
      foreach (var item in dataRow.ItemArray)
      {
        sbResult.Append(item.ToString()+"; ");
      }
      sbResult.AppendLine();
    }
    Потом sbResult.ToString() выводите куда нибудь в HTML, чтобы посмотреть его

    • Помечено в качестве ответа Miklv 3 января 2019 г. 11:19
    2 января 2019 г. 9:51
  • Большое спасибо. Хороший запрос. Показал, что я ошибся с именем таблицы. В разных экземплярах базы оказались разные наименования таблиц. Чтобы убедится что это мой глюк завел новую базы и все повторил.SQL 2012 удобнее тем, что при первом  запуске сайта осуществляется присоединении базы в "App_Data" к серверу и при запуске Managament Studio видно базу в каталоге. Можно смотреть и изменять содержимое таблиц и модернизировать базу. В 2008 этого не было. Однако продолжает нарушаться принцип своей песочницы для каждого сайта в IIS. В разных сайтах не могут быть одинаковые имена файлов баз. Возникает вопрос смогут ли работать в этих условиях два сайта с Entity Framework на одном сервере с идентичными моделями данных.

    Еще раз большое спасибо VadimTagil.

    3 января 2019 г. 11:19