首页 > 解决方案 > 如何从用 C# 编写的程序修复 SQL 中的“文件激活错误”错误消息?

问题描述

我编写了一个使用数据库的 C# 程序,Matches.mdf.

我想测试数据库文件的存在,使用File.Exists例程(代码将出现在问题的末尾)。如果该文件不存在,程序将创建一个具有上述名称的新数据库。为了测试数据库存在例程,我重命名了数据库文件,但是当我想创建数据库时,我收到以下错误消息:数据库“匹配”已存在,请指定不同的名称

在第二次测试中,我在调用创建例程之前使用了数据库删除例程。大错。每次我尝试创建Matches.mdf数据库时,都会收到以下错误消息:

错误信息

我确信这个错误消息的原因是我,修补,因为相同的数据库创建和删除例程以前工作得很好。

我知道我可以通过更改数据库文件的路径来解决问题,但我想知道我到底在这里分手了什么,以便下次知道。

我要问的是:我该怎么做才能解决上述错误?

稍后编辑:我尝试Matches.mdf使用来自 VS 2019 的 SQL Server 对象资源管理器中的查询工具手动重新创建。效果很好,但我认为这不是一个长期的好解决方案。

必要代码:

变量声明:

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();
            }
        }

标签: c#sql-server

解决方案


正如这里所说并由 Jeroen Mostert 确认,Create database不接受查询。该数据库是之前创建的,使用了一些字符串连接。之后查询字符串被参数化,没有意识到这个命令不带参数。这就是为什么将创建数据库查询更改为

Create Database Matches

完美运行。

好吧,生活和学习!


推荐阅读