Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/61: Рейтинг темы: голосов - 61, средняя оценка - 4.64
0 / 0 / 1
Регистрация: 15.09.2012
Сообщений: 40

Создание базы после удаления и ошибка "отказано в доступе"

29.12.2012, 08:23. Показов 12396. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проблема в следующем. Я создаю базу, если её нету по определенному пути. Затем удаляю её в ручную. После этого, снова запускаю программу и пытаюсь создать базу. Но выдается ошибка:

Ошибка 5120: Не удалось открыть физический файл "D:\Base.mdf". Ошибка операционной системы 5: "5<отказано в доступе.>".
Не удалось открыть физический файл "D:\Base.ldf". Ошибка операционной системы 5: "5<отказано в доступе.>".
Невозможно открыть пользовательскую базу данных по умолчанию. Не удалось выполнить вход.

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

Ошибка 4064: Невозможно открыть пользовательскую базу данных по умолчанию. Не удалось выполнить вход.
Ошибка входа пользователя "User-ПК\User".

Вот код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System;
using System.Data.SqlClient;
using System.Data;
using System.IO;
 
namespace Students
{
    class Program
    {
        static void Main(string[] args)
        {
            var filename = Path.Combine("D:\\", "Base.mdf");
            if (!File.Exists(filename))
            {
                CreateSqlDatabase(filename);
                System.Threading.Thread.Sleep(1000);
            }
 
            string connStr = @"Data Source=.\SQLEXPRESS;Integrated Security=True;AttachDbFilename=" + filename;
            SqlConnection conn = new SqlConnection(connStr);
            try
            {
                conn.Open();
            }
            catch (SqlException se)
            {
                Console.WriteLine("Ошибка {0}:{1}", se.Number, se.Message);
                return;
            }
        }
 
        public static void CreateSqlDatabase(string filename)
        {
            string databaseName = Path.GetFileNameWithoutExtension(filename);
            using (var connection = new SqlConnection("Data Source=.\\sqlexpress;Initial Catalog=tempdb;Integrated Security=true;User Instance=True;"))
            {
                connection.Open();
                using (var command = connection.CreateCommand())
                {
                    command.CommandText = String.Format("CREATE DATABASE {0} ON PRIMARY (NAME={0}, FILENAME='{1}')", databaseName, filename);
                    command.ExecuteNonQuery();
 
                    command.CommandText = String.Format("EXEC sp_detach_db '{0}', 'true'", databaseName);
                    command.ExecuteNonQuery();
                }
                connection.Close();
                connection.Dispose();
            }
        }
    }
}
Пользуясь случаем создания темы хотелось бы узнать еще кое-что. Какая база является наиболее быстрой и защищенной для использования в C#? Так как, если речь идет о C# и базах данных, я чаще всего в поисковиках натыкаюсь на .mdf, взял именно её. Но может это не лучший выбор. Мне нужно просто создавать небольшую базу и ежеминутно обновлять там некоторые строки. Но в то же время, нежелательно, что бы по завершении работы программы туда смог залезть каждый желающий и изменить там любые данные.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.12.2012, 08:23
Ответы с готовыми решениями:

Ошибка отказано в доступе
При восстановлении системы Windows 10 с загрузочной флешки, когда пишу команду “bootrec /fixboot” выдаёт отказано в доступе. Подскажите...

Отказано в доступе (ошибка 5)
для всех служб, при попытке запуска выводится такая месага. Я как понял проблема с правами доступа. У меня xp sp3. Это произошло после...

Ошибка Отказано в доступе
Ситуация: 1. Устанавливаю программу в папку ProgramFiles - установка проходит гладко. (Инсталлятор собран с помощью Inno Setup) 2....

13
17 / 17 / 3
Регистрация: 09.12.2011
Сообщений: 64
30.12.2012, 03:10
Первая ошибка: А запуск программы производится из под администратора? Просто описания ошибки говорят, что нужно копать именно в этом направлении. Если у вас Windows 7, то скорее всего нужно явно указать запуск от админа(правой кнопкой на exe-шник и выбираем), даже если ваша учётная запись и есть админская.

Ошибка во 2 пункте.
C#
1
2
3
4
5
6
7
8
9
10
try
{
     conn.Open();
     //conn.Close(); - добавте этот код
}
catch (SqlException se)
{
    Console.WriteLine("Ошибка {0}:{1}", se.Number, se.Message);
    return;
}
Обратите внимание, база открывается, но нигде более не закрывается.
Ваша программа у меня выдала также другие ошибки. Их описание довольно туманное, но смысл в том, что неполучается создать базу, при том что такая база уже есть, думаю это косвенно связано с тем, что база не закрыта.

Насчёт баз данных, есть .mdf - формат файла бд в MS SQL server и .sdf в MS SQL server compact. Вторая СУБД это мини версия первой(но не спутайте с обрезанной версией. у них, как я понял, различные команды разработчиков, причём о MS SQL server compact говорят как о очень кривой бд, в которой переодически могу пропадать данные и нужно её востанавливать ручками).
1
0 / 0 / 1
Регистрация: 15.09.2012
Сообщений: 40
31.12.2012, 09:01  [ТС]
Пробовал так:
conn.Close();

И даже так:
conn.Close();
conn.Dispose();


Та же ошибка. Запуск от имени администратора так же не помогает.
0
17 / 17 / 3
Регистрация: 09.12.2011
Сообщений: 64
31.12.2012, 10:47
Я кажется нашел в чем у вас ошибка. В строчке подключения, надо сдлеать так:
(с вашего позволения я заменил длиннющую строку, на специальный класс, для наглядности)
C#
1
2
3
4
5
SqlConnectionStringBuilder cs = new SqlConnectionStringBuilder();
cs.DataSource = @".\SQLEXPRESS";
cs.AttachDBFilename = filename;
cs.IntegratedSecurity = true;
cs.UserInstance = true;//- вот этой строчке у вас и не хватало
Из за различности в ОС, и возможных специфических ошибок, выкладюю код который я запустил. У меня запустилось как из VS, так и запустив сам файл .exe.
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
using System;
using System.Data.SqlClient;
using System.Data;
using System.IO;
 
namespace Students
{
    class Program
    {
        static void Main(string[] args)
        {
            string filename = Path.Combine("D:\\", "Base.mdf");
            if (!File.Exists(filename))
            {
                Console.WriteLine("Начинается создание базы данных:");
                CreateSqlDatabase(filename);
                Console.WriteLine("  -> Создание успешно завершенно. \nНажмите клавишу для продолжения.");
                Console.ReadKey();
            }
            //string connStr = @"Data Source=.\SQLEXPRESS;Integrated Security=True;AttachDbFilename=" + filename;
            SqlConnectionStringBuilder cs = new SqlConnectionStringBuilder();
            cs.DataSource = @".\SQLEXPRESS";
            cs.AttachDBFilename = filename;
            Console.WriteLine(filename);
            Console.ReadKey();
            cs.IntegratedSecurity = true;
            cs.UserInstance = true;
            SqlConnection conn = new SqlConnection(cs.ToString());
            try
            {
                conn.Open();
                conn.Close();
                Console.WriteLine("Завершение работы программы.");
                Console.ReadKey();
            }
            catch (SqlException e)
            {
                Console.WriteLine("Ошибка {0}:{1}", e.Number, e.Message);
                Console.ReadKey();
            }
        }
        public static void CreateSqlDatabase(string filename)
        {
            try
            {
                string databaseName = Path.GetFileNameWithoutExtension(filename);
                SqlConnection connection = new
                    SqlConnection("Data Source=.\\sqlexpress;Initial Catalog=tempdb;Integrated Security=true;User Instance=True;");
                connection.Open();
                SqlCommand command = connection.CreateCommand();
 
                command.CommandText =
                String.Format("CREATE DATABASE {0} ON PRIMARY (NAME={0}, FILENAME='{1}')", databaseName, filename);
                command.ExecuteNonQuery();
                command.CommandText = String.Format("EXEC sp_detach_db '{0}', 'true'", databaseName);
                command.ExecuteNonQuery();
                connection.Close();
            }
            catch
            {
                Console.WriteLine("Ошибка!");
            }
        }
    }
}
1
0 / 0 / 1
Регистрация: 15.09.2012
Сообщений: 40
01.01.2013, 09:20  [ТС]
Премного благодарен.

Еще один маленький вопросик. Чем можно открыть и просматривать (возможно изменять) .mdf базу?

Добавлено через 47 минут
Среди приблизительно 500 ссылок на demon tools и microsoft access и прочее прочее, я таки случайно наткнулся на сайт, где имеется немало программ для открытия .mdf Так что вопрос решен)
0
16 / 16 / 6
Регистрация: 31.01.2011
Сообщений: 178
30.11.2014, 11:32
Здравствуйте! Кто-нибудь может посоветовать топик с решением идентичной проблемы, но только на делфи и с базой *.sql?
0
5 / 5 / 0
Регистрация: 02.06.2014
Сообщений: 37
07.07.2022, 16:35
Hi всем!

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

строка соединения:
Data Source=.\\SQLEXPRESS;AttachDbFileName=|D ataDirectory|\\Database_archive.mdf;Inte grated Security=True;User Instance=True;MultipleActiveResultSets=T rue

пробовал так:
Data Source=.\\SQLEXPRESS;AttachDbFileName=|D ataDirectory|\\Database_archive.mdf;Pers ist Security Info=False;Integrated Security=True;User Instance=True;MultipleActiveResultSets=T rue

тоже не соединяет.

До открытия в студии все работало, но очень неудобно было создавать ограничения и кучу мелких табличек.

И что теперь делать? Да, база на локальном sqlexpress, который в студию встроен...
0
 Аватар для Andrey-MSK
3313 / 2200 / 387
Регистрация: 14.08.2018
Сообщений: 7,404
Записей в блоге: 4
07.07.2022, 16:46
Цитата Сообщение от imerlin Посмотреть сообщение
Да, база на локальном sqlexpress, который в студию встроен...
Цитата Сообщение от imerlin Посмотреть сообщение
Data Source=.\\SQLEXPRESS;AttachDbFileName=|D ataDirectory|\\Datab ase_archive.mdf;
Ваще-то в VS встроен LocalDB, так что срока соединения другая будет... Примерно такая, при подключении к БД созданной в SSMS на сервере LocalDB:
Code
1
connectionString="Data Source=(LocalDB)\MSSQLLocalDB;Initial Catalog=Test;Integrated Security=True;"
0
5 / 5 / 0
Регистрация: 02.06.2014
Сообщений: 37
08.07.2022, 08:55
Спасибо, но пишет что такой сервер не найден.

Я, похоже, сам малость запутался, машина не моя, стал смотреть: SQL сервер установлен.
Раньше соединение работало прекрасно, но вчера решил добавить констракшены и несколько мелких таблиц, для этого скачал SQL Management studio, открыл там эту БД (для чего пришлось закрыть вижул студию), поработал, отсоединил от SQLMS, и теперь коннекшен выдает ошибку:


Не удалось открыть физический файл "D:\Документы - Иванов\Documents\Visual Studio 2008\WebSites\Archive_v1\App_Data\Databa se_archive.mdf". Ошибка операционной системы 5: "5(Отказано в доступе.)".
Не удалось прикрепить базу данных, которой автоматически было присвоено имя, к файлу D:\Документы - Иванов\Documents\Visual Studio 2008\WebSites\Archive_v1\App_Data\Databa se_archive.mdf. База данных с таким именем уже существует, указанный файл нельзя открыть, или он находится на общем ресурсе UNC.
0
 Аватар для Andrey-MSK
3313 / 2200 / 387
Регистрация: 14.08.2018
Сообщений: 7,404
Записей в блоге: 4
08.07.2022, 09:07
Цитата Сообщение от imerlin Посмотреть сообщение
SQL сервер установлен.
Имя у сервера какое? Если ничего не меняли, то по умолчанию SQLEXPRESS, тогда строка такая
XML
1
connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=Test;Integrated Security=True;"
Вместо .\ можно вбить имя компьютера.

Добавлено через 1 минуту
И БД должна быть установлена на сервер, проверьте в SSMS, есть там она или нет.
0
5 / 5 / 0
Регистрация: 02.06.2014
Сообщений: 37
08.07.2022, 10:28
В смысле на сервер? Я в этих делах только начинаю разбираться, не до конца понимаю всю эту взаимосвязь.
Я создал проект на ASP.net в MS Studio. Создал БД, таблицы, поля, заполнил тестовыми значениями.
Написал обработчики запросов на C#, все работало.
была такая строка соединения:
string sConn = "Data Source=.\\SQLEXPRESS;AttachDbFileName=|D ataDirectory|\\Database_archive.mdf;Inte grated Security=True;User Instance=True;MultipleActiveResultSets=T rue";
Затем мне понадобилось добавить сразу несколько таблиц с одинаковой структурой, создать ограничения, поэтому черт меня дернул скачать и установить SQLMS 18, там это мне показалось сделать удобнее.
После того, как я поработал в ней, перестало соединяться.
У меня ощущение, что когда я запускал SQLMS (а мне пришлось запускать ее под админской учеткой, иначе он не хотел присоединять БД), то владельцем БД стал админ. Я сейчас пытаюсь восстановить доступ: создать нового пользователя - не создает, говорит что такого имени для входа создать нельзя, переключаю проверку подлинности на SQL, но ничего не выходит. Сейчас с отчаяния пытаюсь написать скрипт для генерации БД через CREATE TABLE, что бы заменить БД на новую, не знаю что выйдет.
В SQLMS база не была присоединена, когда я запустил ее впервые, потом я ее и присоединял и отсоединял - все без толку.
Но когда я запустил MS Studio под админкой, доступ к базе появился, но так работать у нас нельзя, поэтому пытаюсь восстановить доступ из под юзера...

Я прошу прощения за сумбур, но действительно, как писать программы более менее понимаю, а вот в администрировании как то... Да и сайт пишу впервые...
Спасибо за готовность помочь.
0
 Аватар для Andrey-MSK
3313 / 2200 / 387
Регистрация: 14.08.2018
Сообщений: 7,404
Записей в блоге: 4
08.07.2022, 10:33
Цитата Сообщение от imerlin Посмотреть сообщение
Создал БД, таблицы, поля, заполнил тестовыми значениями.
Это всё должно делаться в SQL Server Management Studio (SSMS), а проект в Visual Studio, кодом, через строку подключения, подключается уже к серверу SQL (LocalDB, SQLEXPRESS - не важно).
Для смены владельца БД используйте - sp_changedbowner (Transact-SQL)
0
5 / 5 / 0
Регистрация: 02.06.2014
Сообщений: 37
08.07.2022, 11:01
К сожалению не вышло.
В VS даже в обозревателе серверов красный крестик на ветке к mdf файлу, и при попыте обновить пишет:

Не удалось открыть физический файл "D:\Документы - Иванов\Documents\Visual Studio 2008\WebSites\Archive_v1\App_Data\Databa se_archive.mdf". Ошибка операционной системы 5: "5(Отказано в доступе.)".
Не удалось прикрепить базу данных, которой автоматически было присвоено имя, к файлу D:\Документы - Иванов\Documents\Visual Studio 2008\WebSites\Archive_v1\App_Data\Databa se_archive.mdf. База данных с таким именем уже существует, указанный файл нельзя открыть, или он находится на общем ресурсе UNC.
0
 Аватар для Andrey-MSK
3313 / 2200 / 387
Регистрация: 14.08.2018
Сообщений: 7,404
Записей в блоге: 4
08.07.2022, 11:15
imerlin, ещё раз
1. БД создаётся в SSMS. SSMS подключена к установленному серверу - LocalDB, SQLEXPRESS и т.д.

2. В Visual Studio создаётся проект, в котором в файле конфигурации, для FW 4.x это App.config, для NET Core 3+ это appsettings.json, прописываются строки подключения вот примерно такие, имя сервера и БД у вас свои:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
  </startup>
  <connectionStrings>
    <add name="SQLConnectDebug"
         connectionString="Data Source=(LocalDB)\MSSQLLocalDB;Initial Catalog=Test;Integrated Security=True;"          
         providerName="System.Data.SqlClient" />      
    <add name="SQLConnect" 
         connectionString="Data Source=main-sql\sqlexpress2008;Initial Catalog=Test;Integrated Security=True;" 
         providerName="System.Data.SqlClient" />      
    <add name="ExcelXLSConnect" 
         connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR=Yes;'" />
    <add name="ExcelXLSXConnect" 
         connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0 Xml;HDR=Yes;'" />
  </connectionStrings>
</configuration>
3. Далее в коде создаётся класс, который получает эти строки из конфигурации и передаёт их куда-нибудь, вот например у меня базовый класс для доступа к БД, вы напишите свой:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using System.Configuration;
using System.IO;
 
namespace DALibrary.DataAccess
{
    public class BaseDA
    {
#if DEBUG
        protected readonly string _connectionString = ConfigurationManager.ConnectionStrings["SQLConnectDebug"].ConnectionString;
#else
        protected readonly string _connectionString = ConfigurationManager.ConnectionStrings["SQLConnect"].ConnectionString;
#endif
 
        protected BaseDA() { }
 
        protected string GetExcelConnectionString(string pathToFile)
        {
            string extension = Path.GetExtension(pathToFile);
            string excelConString = string.Empty;
 
            switch (extension)
            {
                case ".xls":
                    excelConString = ConfigurationManager.ConnectionStrings["ExcelXLSConnect"].ConnectionString;
                    break;
                case ".xlsx":
                    excelConString = ConfigurationManager.ConnectionStrings["ExcelXLSXConnect"].ConnectionString;
                    break;
            }
 
            return string.Format(excelConString, pathToFile);
        }
    }
}
Классы доступа, которые наследуются от этого базового класса, автоматически получают все строки подключения.

4. Из Visual Studio никогда не работают с серверами SQL напрямую, возможность есть, но она скорее для того, чтобы накидать чего-нибудь по быстрому, а не для полноценной работы с сервером SQL.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.07.2022, 11:15
Помогаю со студенческими работами здесь

Отказано в доступе ошибка 5
Привет всем мастерам-умельцам! Моя проблема Принесли бук с win 7. Вроде все работает. Но нельзя создать/удалить пользователя, загрузить...

Ошибка отказано в доступе Win XP
Создаю программу для запуска игры. Но вот в чем проблема при запуске на Windows XP (Только на нём возникает ошибка) вот этого кода : ...

Windows 10 после обновления отказано в доступе к системным папкам
Здравствуйте! Месяца 2-3 назад всё было нормально, а сегодня решил почистить комп (места совсем мало осталось на диске С), и удивился...

RDP-подключение. Ошибка, отказано в доступе
Здравствуйте!!!) Такой вопрос возник: внезапно во всем офисе при подключении через RDP к серверу терминалов возникает ошибка &quot;Отказано...

Ошибка: 'Cannot open clipboard: Отказано в доступе'
Здрасте, не могу победить ошибку Exception class EClipboardException with message 'Cannot open clipboard: Отказано в доступе'. при работе...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru