【问题标题】:Cannot find file specified when dropping LocalDb database if .mdf was deleted如果删除了 .mdf,则在删除 LocalDb 数据库时找不到指定的文件
【发布时间】:2018-04-10 22:00:59
【问题描述】:

我正在尝试编写一个应用程序,如果在应用程序的文件夹中找不到它,它将创建一个本地数据库。我在删除 .mdf 后运行此查询

IF EXISTS (SELECT * FROM sys.databases WHERE name = N'Test_db')
BEGIN 
     DROP DATABASE Test_db 
END

CREATE DATABASE Test_db 
ON PRIMARY (NAME=Test_db, FILENAME='...\Test_db.mdf')

我的command.ExecuteNonQuery() 抛出异常,即使它删除了数据库并创建了一个新数据库。错误来自命令的DROP DATABASE 部分。

附加信息:无法打开物理文件 “...\Test_db.mdf”。操作系统错误 2:“2(系统无法 找到指定的文件。)”。

文件激活失败。物理文件名 “...\Test_db_log.ldf”可能不正确。

我找到了this的问题,但它没有解决问题。

【问题讨论】:

  • ...mdf文件实际代码的路径中,还是这是一个例子?您尝试写入此文件的路径可以从您的应用程序访问吗?我只是用这个路径检查你的代码:d:\Test_db.mdf 它工作得很好
  • @gofr1 ...\ 就是一个例子。我使用Environment.CurrentDirectory 构建路径的方法,我只是替换了这些值以使其更易于阅读。但如前所述,.mdf 创建得很好,它只是删除了引发错误的数据库,因为我删除了 .mdf。
  • 那么如果 DROP 应该这样做,为什么要删除文件?
  • @gofr1 我正在尝试处理.mdf 被删除的情况。我不能只创建数据库,因为它已经存在,删除它会引发错误。
  • 据我所知,如果mdf 文件被删除,但数据库没有被删除(例如这种情况偶尔发生),那么它(默认情况下)进入RECOVERY_PENDING 模式。您可以在state_descsys.databases 表中查看它

标签: c# sql sql-server localdb


【解决方案1】:

问题的解决方案是sp_detach_db,因为它从服务器中删除数据库而不从文件系统中删除文件

EXEC sp_detach_db 'Test_db'

【讨论】:

    【解决方案2】:

    如果您担心文件被删除,请尝试File.Exists

    if (File.Exists(pathname))
    {
        // Execute your SQL
    }
    else
    {
        // Error processing
    }
    

    【讨论】:

    • 我进行了这项检查,但如果 SQL 不存在,我将执行它,因此它将创建一个 .mdf。也就是说,SQL就是错误处理,如果数据库文件存在则什么都不用做
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多