在SQL Server数据库项目构建过程中使用错误的编译器

本文关键字:错误 编译器 过程中 构建 SQL Server 数据库 项目 | 更新日期: 2023-09-27 18:16:32

我有一个使用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功能。您可以检查问题如何从命令行运行Roslyn而不是csc.exe ?

我试着用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)?

在SQL Server数据库项目构建过程中使用错误的编译器

我也试图这样做,并面临同样的问题。我的解决方法是创建一个单独的常规类库项目。我将c#代码从我的数据库项目移动到新的库中(将使用vs2015使用c# 6/Roslyn编译)。然后从我的数据库项目中引用这个类库。

只要记住设置类库引用的属性:Model Aware =true和Generate Sql Script =true。我还没有对此进行彻底的测试,但是我能够通过使用publish命令从我的Database项目中部署它,并在类库中调用该函数。

好消息!
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的最终版本中改变。

您将需要以将要部署到的SQL版本所使用的clr版本为目标:

SQL 2005-2008 R2 = CLR 2

SQL 2012 = CLR 4

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

爱德