在 SQL Server 数据库项目构建期间使用错误的编译器

Posted

技术标签:

【中文标题】在 SQL Server 数据库项目构建期间使用错误的编译器【英文标题】:Usage of wrong compiler during SQL Server Database Project building 【发布时间】:2015-10-08 09:24:53 【问题描述】:

我在使用 Visual Studio 2015 编译 SSDT SQL Server 数据库项目时遇到问题。我想在我的数据库项目中使用 C# 6 功能,但似乎不受支持。 例如,我在我的 db 项目中添加了下一个类:

namespace Database1

    class ClassFile1
    
        public string Str  get;  = string.Empty;
    

我试图编译这个,但我得到了错误:

CS1519:类、结构或接口成员声明中的标记“=”无效

我发现这个错误的原因是VS 2015使用的编译器版本错误。下一个编译行是VS生成的:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe /noconfig /nowarn:1701,1702,2008 /nostdlib+ /errorreport:prompt /warn:4 /define:DEBUG;TRACE /errorendlocation /preferreduilang:en-US /highentropyva+ /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6\mscorlib.dll" /debug+ /debug:full /optimize- /out:obj\Debug\Database2.dll /subsystemversion:6.00 /target:library /warnaserror- /utf8output ClassFile1.cs 

如您所见,使用了C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe,是错误的。

我已经尝试从 VS 2015 的开发人员命令提示符编译 db 项目,并且成功完成,因为在此提示符内 csc.exe 是 Roslyn 编译器 (C:\Program Files (x86)\MSBuild\14.0\Bin\csc. exe) 支持 C# 6 功能。您可以查看问题How to run Roslyn instead csc.exe from command line?

我尝试使用MSBuild 14.0编译项目,也成功了。

问题是:如何更改/覆盖我的 VS 用于编译 SSDT DB 项目的编译器版本,从旧的 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe 到新的 Roslyn 编译器(C:\Program Files (x86)\MSBuild\14.0\Bin\csc.exe)?

【问题讨论】:

【参考方案1】:

我也尝试过这样做,但遇到了同样的问题。我的解决方法是创建一个单独的常规类库项目。我将 C# 代码从我的数据库项目移到了新库中(将使用 C#6/Roslyn by VS 2015 编译)。然后从我的数据库项目中引用这个类库。

只记得设置类库引用的属性:Model Aware=true 和Generate Sql Script=true。我还没有彻底测试过,但是我可以使用发布命令从我的数据库项目中部署它,并调用类库中的函数。

【讨论】:

【参考方案2】:

好消息! Visual Studio 2017 将为 SSDT 数据库项目使用当前的 C# 编译器,因此 C# 6 最终将在 SQL Server 程序集中工作。

使用的编译器的路径是:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\csc.exe

因为所有 C# 6 功能都只是纯编译器功能,如果您只针对 .NET 3.5 和 SQL Server 2008,您现在甚至可以使用它们。

在 Visual Studio 2017 RC 中,我还能够使用一些 C# 7 功能,例如表达式主体构造函数、新的 out 变量、ref 返回、增强的 switch/is 模式匹配和改进的二进制/十六进制文字.但我无法使用本地函数或与元组相关的任何东西,例如新的元组返回类型、元组文字或新的解构声明。 也许这种行为会在 Visual Studio 2017 的最终版本中改变。

【讨论】:

【参考方案3】:

您需要针对您将部署到的 SQL 版本所使用的 clr 版本:

SQL 2005-2008 R2 = CLR 2

SQL 2012 = CLR 4

恐怕你不能只运行机器上任何版本的 clr。

编辑

【讨论】:

我没明白。我的项目设置使用 SQL Server 2014 目标平台。而且我使用的是 SQL Server 2014。为什么如果我使用 MsBuild 中的 csc.exe 它全部成功构建并成功部署呢?我要做的就是更改 VS 2015 用于构建 sql 项目的编译器。 不支持你必须使用 clr 4 好的,我应该更改哪些属性才能使用 clr 4?

以上是关于在 SQL Server 数据库项目构建期间使用错误的编译器的主要内容,如果未能解决你的问题,请参考以下文章

从命令行构建一个面向 SQL Server 2012 的数据库项目

MS Build 期间的时间戳

在 M1 Mac 上的 Azure Data Studio 中构建 SQL Server 数据库项目真的不可能吗?

SetPropertyValue 期间的 CreateUserWizard 错误:无法连接到 SQL Server 数据库

带有生成Excel文件脚本的SSIS项目在vs中可以执行成功,但部署到sql server中执行就报错调用目标发生异常

插入期间表被锁定...网站无法使用(sql server 2008)