【问题标题】:VSTS and LocalDB: Failed to update database XXX because the database is read-onlyVSTS 和 LocalDB:更新数据库 XXX 失败,因为数据库是只读的
【发布时间】:2017-12-14 16:29:09
【问题描述】:

我们正在使用 VSTS,并且在持续构建过程中运行的集成测试期间开始出现错误。我们使用 localdb 来再次运行测试,这是一个预定义的 mdb 文件,该文件被复制到单元测试项目的输出文件夹中。

我们正在使用 powershell 脚本来确保 localdb 正在执行。 IT 有一行:

SqlLocalDB.exe create "MSSQLLocalDB" -s

用于运行集成测试的连接字符串是这样动态构建的:

$"Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename={Path.GetDirectoryName(new Uri(Assembly.GetExecutingAssembly().CodeBase).AbsolutePath)}\\db.mdf;Integrated Security=True;MultipleActiveResultSets=True";

我们最近唯一改变的是我们已经开始针对 .NET 4.7.1 进行构建,但我认为这不会对这些问题产生任何影响...

关于我们为什么开始出现这些错误的任何线索?

【问题讨论】:

  • 你是更新测试中的记录还是更新了mdb文件?你用私人代理吗?尝试在连接字符串(Initial Catalog=xx)中指定数据库名称。另一方面,尝试执行ALTER DATABASE [dbName] SET READ_WRITE WITH NO_WAIT
  • 我刚刚运行了一个 CI 并开始面临同样的问题。我已经运行相同的构建很长时间了,并且没有对 localdb 数据库进行任何更改
  • 这与我的情况非常相似:它工作了很长时间,然后就停止了。就我而言,我已经更新了框架版本,但这不应该有任何影响......我认为......
  • 重现此问题的步骤是什么?可以分享 OneDrive 上的日志吗? (将system.debug变量设置为true,然后队列构建)你更新测试中的记录还是mdb文件已经更新?你用私人代理吗?尝试在连接字符串中指定数据库名称 (Initial Catalog=xx)。另一方面,尝试执行ALTER DATABASE [dbName] SET READ_WRITE WITH NO_WAIT
  • 就我而言,我使用的是 NH,集成测试使用的是 PersistenceSpecification 对象(如果我没记错的话,它将插入然后加载数据以查看是否一切正常。 ..)

标签: continuous-integration azure-devops integration-testing localdb


【解决方案1】:

解决方案是确保您要恢复的 .mdf 位于 Build agent users temp 目录中。

可以使用 %TEMP% 环境变量检索临时目录位置。在c#中

Environment.GetEnvironmentVariable("TEMP")

您可以使用 sp_attach_db 进行恢复

EXEC sp_attach_db @dbname = N'YourDbName', @filename1 = 'TEMPFOLDER\YourDbName.mdf' 

上面一行中的 TEMPFOLDER 已被替换,但是您认为它适合作为 TEMP 环境变量的值。

【讨论】:

  • 你好格兰特。那么,您是说我需要将 mdb 文件复制到临时文件夹(而不是发布文件夹)并从那里附加它?谢谢。
  • 谁能建议如何实现这一目标?我目前有一个共享项目,其中包含我的 MDF 文件和 2 个引用共享项目的测试项目。 MDF 文件设置为 始终复制,因此它最终位于我的两个测试项目的 bin 目录中。在这两个项目中我都有"Data Source=(LocalDB)\mssqllocaldb;AttachDbFilename=|DataDirectory|\db.mdf;...,所以我在测试中直接使用这个连接字符串。我不喜欢将我的 mdf 复制到 TEMP 的 pre/post-build 脚本的方法。还有其他方法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 2013-01-14
  • 2011-08-08
  • 2014-06-09
相关资源
最近更新 更多