经过又一天的努力,终于让数据库项目全编通过。
现在的解决方案里已经有十个项目了,其中八个数据库项目,一个服务器项目(SQL Server 2005 Server Project),一个单元测试项目。
直到下午还是满屏的Error,但经过不断的搜索(资料不多)和数次尝试,找到了关键问题和应对方法,后面就是对其余的项目重复几次这个过程,终于迎来了曙光。
再次给出关于 数据库引用的资料链接 (MSDN)
简单整理步骤如下:
1. 因为数据库中自定义的Schema对象依赖于“Login”,所以需要建立一个Server Project,导入master;
为了顺利Build该项目,需要添加对master.schema的引用,该文件位于VS2010的安装目录,上面链接里有介绍。
2. 各数据库项目都添加对上述Server Project的引用,注意,同时也要添加对 master.schema的引用 (这里只是急于解决问题,声明下不是标准步骤)
3. 从最外围最少用的库对应的Database Project开始。先Unload掉其他Database Project,减少干扰,先集中精力消除项目自身的错误(非引用错误)。
自身错误主要是语法错误,语法错误一般很少,毕竟是实际在用的开发数据库。
今天只遇到一个SQL2000中FLOAT(m,n)无法通过SQL2005语法检查的问题。(意外发现这个升级遗留问题,这一方面也展现了VS对Schema进行静态检查的优秀功能,以及我们使用适当的工具辅助我们工作的必要性)
4. 接下来处理引用错误,就是那些视图,存储过程中包含对其他数据库对象的引用导致的错误。
还是那个减少干扰的思路,先从较为少用的库项目开始Reload。
这里有个关键细节,就是在添加数据库引用(项目型引用)时,相比昨天采用默认的参数,今天尝试了使用 Database Reference Variables, 因为数据库都在同一台服务器的原因,所以没使用Server Variable,只定义了Database variable。
没有勾选“Literal”。
"Name"栏输入数据库名称(当然输入别的合法变量名也没问题)。
"Value"输入数据库名称。Value可以在部署项目时修改为实际的名字,这点昨天提到过,数据库变量的一个作用就在于解决开发和部署的数据库名称差异问题。
可以注意到,"Name”在编辑焦点离开后,会自动变成 $(Db1) 的形式,这也就是我们要在脚本中使用的表示其他数据库的变量。VS这里有个贴心并且体验良好的功能,勾选下面的“Updating Schema Objects and Scripts”,在确定后VS会自动找出已有的对其他数据库的引用,并自动替换为前面定义的变量,形式为 [$(Db1)]。如果手写的话,注意方括号([])不缺少为妙。
在使用数据库变量之后,非常多的SQL03006错误自动闪躲。
在指定“Name”而不是使用“Literal”(文本方式引用数据库)之后,SQL04105也排队撤离。
(当然,这里提醒还是要好好阅读MSDN,搞清因果,结合需求而行,并不是任何时候都要这么用,否则选项就没有提供的价值啦)
(文档中提到的复合项目,相比使用数据库引用,更适合一组数据库要协同部署的情况)
5. 在对所有数据库项目这么演练一番后,只剩下些散兵游勇。
我遇到的具体情况比较理想,清一色地视图里有昨天SQL03006 2)的情况,替换掉几个后,解决方案终于顺利全编通过。
6.(遗留)还有1083个警告,日后慢慢消化,边理解边解决。
正好上午有个用户报了个BUG,估计和数据库访问有关,就顺手找到对应的存储过程文件,在Schema视图下,右键自动创建了对应的单元测试脚本,协助定位bug。
享受劳动成果确实是件好事,虽然已经是下班后的事啦。
P.S. 下一个需求是数据库单元测试,先放个今天偶然看到的资料
Test Driven Development with Visual Studio for Database Professionals (InfoQ)