Как я могу исправить сообщение об ошибке «Ошибка активации файла» в SQL из программы, написанной на C #? - PullRequest
0 голосов
/ 03 июня 2019

Я пишу программу на C #, которая использует базу данных, Matches.mdf.

Я хочу проверить существование файла базы данных, используя процедуру File.Exists (коды появятся в конце вопроса). Если файл не существует, программа создает новую базу данных с указанным выше именем. Чтобы протестировать процедуру существования базы данных, я переименовал файл базы данных, но когда мне захотелось создать базу данных, я получил следующее сообщение об ошибке: База данных "Соответствует" уже существует, укажите другое имя .

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

error message

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

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

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

Позднее редактирование: я пытался вручную воссоздать Matches.mdf, используя инструмент запросов из SQL Server Object Explorer из VS 2019. Работал отлично, но я не думаю, что это хорошее решение в долгосрочной перспективе.

Необходимые коды:

Объявления переменных:

static readonly string DatabaseFolder = Path.GetDirectoryName(Application.ExecutablePath) + "\\db";
readonly string DatabaseFile = DatabaseFolder + "\\Matches.mdf";
readonly string DatabaseLog = DatabaseFolder + "\\MatchesLog.ldf";

Функция, которая проверяет существование файла базы данных:

    public bool DatabaseExists()
    {
        return File.Exists(DatabaseFile);
    }

Процедура создания базы данных:

 private bool CreateDatabaseFile()
        {
        SqlConnection MyConn = new SqlConnection(CreateDatabaseConnectionString);
        string Str = "Create Database Matches on Primary (Name=Matches, Filename='@DatabaseFile') log on (Name=MatchesLog, Filename='@DatabaseLog')"; 
        SqlCommand DatabaseCreationCommand = new SqlCommand(Str, MyConn);
        DatabaseCreationCommand.Parameters.Add("@DatabaseFile", SqlDbType.Text).Value = DatabaseFile;
        DatabaseCreationCommand.Parameters.Add("@DatabaseLog", SqlDbType.Text).Value = DatabaseLog;
        try
        {
            MyConn.Open();
            DatabaseCreationCommand.ExecuteNonQuery();
        }
        catch (SqlException S)
        {
            MessageBox.Show(S.Message);
            return false;
        }
        catch (IOException I)
        {
            MessageBox.Show(I.Message);
            return false;
        }
        catch (InvalidOperationException I)
        {
            MessageBox.Show(I.Message);
            return false;
        }
        catch (InvalidCastException I)
        {
            MessageBox.Show(I.Message);
            return false;
        }
        finally
        {
            MyConn.Close();
        }
        return true;
    }

Процедура удаления базы данных:

public void DeleteDatabase()
        {
            string Str;
            SqlConnection MyConn = new SqlConnection(CreateDatabaseConnectionString);
            Str = "Alter database Matches set single_user with rollback immediate\r\ndrop database Matches";
            SqlCommand command = new SqlCommand(Str, MyConn);
            try
            {
                MyConn.Open();
                command.ExecuteNonQuery();
            }
            catch (SqlException S)
            {
                MessageBox.Show(S.Message);
            }
            catch (IOException I)
            {
                MessageBox.Show(I.Message);
            }
            catch (InvalidOperationException I)
            {
                MessageBox.Show(I.Message);
            }
            catch (InvalidCastException I)
            {
                MessageBox.Show(I.Message);
            }
            finally
            {
                MyConn.Close();
            }
        }

1 Ответ

0 голосов
/ 03 июня 2019

Как сказано здесь и подтверждено Йеруном Мостертом, Create database не принимает запросы. База данных была создана ранее с использованием конкатенации строк. Впоследствии строка запроса была параметризована, не осознавая, что эта команда не принимает параметры. Вот почему изменение запроса на создание базы данных на

Create Database Matches

отлично работает.

Ну, живи и учись!

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