无法更新数据库,因为数据库是只读的

时间:2014-05-24 14:06:54

标签: winforms sql-server-2012 localdb

我创建了一个winform应用程序,并在应用程序第一次运行时以编程方式尝试附加数据库。不幸的是在Windows 7中我总是出错。请查看下面的截图,它讲述了整个故事。现在我的问题是,如何摆脱这个错误,有没有办法自动提供应用程序安装的文件夹所需的权限?我想永久解决此错误,需要顺利的附件。有人请帮忙。

请查看以下错误。提前致谢

enter image description here

3 个答案:

答案 0 :(得分:3)

尝试ALTER DATABASE MyDatabaseName SET READ_WRITE

此处有更多信息on This forum

修改 This was asked by someone else

答案 1 :(得分:1)

如果将数据库放在Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData返回的目录的子目录中,则用户将具有读/写权限。

请参阅Environment.SpecialFolder Enumeration以确定其他位置是否更合适,例如ApplicationData如果您需要漫游或CommonApplicationData,如果您需要计算机的所有用户使用它。{/ p>

修改:我找到了这个答案的稍微更广泛的版本:Where Should I Store my Data and Configuration Files if I Target Multiple OS Versions?,另请参阅它链接到的文章。

答案 2 :(得分:0)

我知道这个答案迟到了,但我相信人们总是面临同样的问题,所以我的情况值得分享。

tl; dr =更改已部署文件的权限手动或使用 icacls 命令。

实际上我使用InstallForge来打包和部署我的应用程序。 无论使用何种设置创建者,当应用程序安装到非系统文件夹(例如D:\)时,程序都可以正常工作,数据库是可读/可写的。

当应用程序安装在[Program Files]文件夹或[Program Files(X86)]文件夹中时,Windows会进行预防性安全测量,并将文件权限设置为仅[Read]和[Read&执行]。

我认为Windows Vista及更高版本的Windows会出现这种情况。

您可以通过右键单击安装的文件并转到属性然后安全标签来检查。

我在D:\上安装的文件具有完全控制权限,而正如我所提到的那样,C:\上的文件只有 Read&执行权限。

在C:\上安装普通程序时,您不会注意到区别,因为您可能没有在文件或数据库上写入数据。但是在数据库部署的情况下,该文件必须是可写的。

最后,此案例的解决方案是告诉 InstallForge 使用icacls命令在安装结束时更改文件权限:

icacls "C:\MyApp\MyDB.mdf" /Grant Everyone:F
icacls "C:\MyApp\MyDB_log.ldf" /Grant Everyone:F

在我的情况下,可以让每个人都对数据库文件进行全面控制,但是您可能需要为您的案例定制解决方案,所以请参考: http://ss64.com/nt/icacls.html

您可以告诉您的设置创建者运行这些命令,或者您可以将它们放在批处理文件中并在安装后运行它。