【发布时间】:2021-07-11 01:16:22
【问题描述】:
如何将 VB.net SQL CLR 函数转换为 VS SSDT SQL 项目的 C# CLR 函数?
我需要将其转换为 C#,因为看起来 built-in SSDT Project support for CLR functions is C# only?如果我能找到一种以与 VS SSDT 项目兼容的方式使用原始 VB 并且不会破坏发布工作流程的方法,那么我会接受这个答案!我发现使用 SSMS 中的 T-SQL 命令将 .dll 编译到 SQL Server 中非常容易……但是当我将它带入我们的 SSDT 项目以合并到我们的下一个 .dacpac 版本中时,没有任何效果!
SqlFunction(IsDeterministic:=True, IsPrecise:=True)> _
Public Shared Function RegExOptionEnumeration(ByVal IgnoreCase As SqlBoolean, _
ByVal MultiLine As SqlBoolean, _
ByVal ExplicitCapture As SqlBoolean, _
ByVal Compiled As SqlBoolean, _
ByVal SingleLine As SqlBoolean, _
ByVal IgnorePatternWhitespace As SqlBoolean, _
ByVal RightToLeft As SqlBoolean, _
ByVal ECMAScript As SqlBoolean, _
ByVal CultureInvariant As SqlBoolean) _
As SqlInt32
Dim Result As Integer
Result = (IIf(IgnoreCase.Value, RegexOptions.IgnoreCase, RegexOptions.None) Or _
IIf(MultiLine.Value, RegexOptions.Multiline, RegexOptions.None) Or _
IIf(ExplicitCapture.Value, RegexOptions.ExplicitCapture, _
RegexOptions.None) Or _
IIf(Compiled.Value, RegexOptions.Compiled, RegexOptions.None) Or _
IIf(SingleLine.Value, RegexOptions.Singleline, RegexOptions.None) Or _
IIf(IgnorePatternWhitespace.Value, RegexOptions.IgnorePatternWhitespace, _
RegexOptions.None) Or _
IIf(RightToLeft.Value, RegexOptions.RightToLeft, RegexOptions.None) Or _
IIf(ECMAScript.Value, RegexOptions.ECMAScript, RegexOptions.None) Or _
IIf(CultureInvariant.Value, RegexOptions.CultureInvariant, RegexOptions.None))
Return (Result)
我已尝试通过Telerik C# Converter 运行Class。
Telerik 在 C# 下生成:
public class RegularExpressionFunctions
{
//
// RegExOptions function
// this is used simply to create the bitmap that is passed to the various
// CLR routines
[SqlFunction(IsDeterministic = true, IsPrecise = true)]
public static SqlInt32 RegExOptionEnumeration(SqlBoolean IgnoreCase, SqlBoolean MultiLine, SqlBoolean ExplicitCapture, SqlBoolean Compiled, SqlBoolean SingleLine, SqlBoolean IgnorePatternWhitespace, SqlBoolean RightToLeft, SqlBoolean ECMAScript, SqlBoolean CultureInvariant)
{
int Result;
Result = (Interaction.IIf(IgnoreCase.Value, RegexOptions.IgnoreCase, RegexOptions.None) | Interaction.IIf(MultiLine.Value, RegexOptions.Multiline, RegexOptions.None) | Interaction.IIf(ExplicitCapture.Value, RegexOptions.ExplicitCapture, RegexOptions.None) | Interaction.IIf(Compiled.Value, RegexOptions.Compiled, RegexOptions.None) | Interaction.IIf(SingleLine.Value, RegexOptions.Singleline, RegexOptions.None) | Interaction.IIf(IgnorePatternWhitespace.Value, RegexOptions.IgnorePatternWhitespace, RegexOptions.None) | Interaction.IIf(RightToLeft.Value, RegexOptions.RightToLeft, RegexOptions.None) | Interaction.IIf(ECMAScript.Value, RegexOptions.ECMAScript, RegexOptions.None) | Interaction.IIf(CultureInvariant.Value, RegexOptions.CultureInvariant, RegexOptions.None));
return (Result);
}
}
类中的所有其他函数似乎都可以使用 Telerik 转换器进行转换。 我试着四处寻找这个,似乎是IIf is similar to ternary operators。在此基础上,我尝试了以下2个示例,但没有任何效果...
尝试 1
[SqlFunction(IsDeterministic = true, IsPrecise = true)]
public static SqlInt32 RegExOptionEnumeration(SqlBoolean IgnoreCase, SqlBoolean MultiLine, SqlBoolean ExplicitCapture, SqlBoolean Compiled, SqlBoolean SingleLine, SqlBoolean IgnorePatternWhitespace, SqlBoolean RightToLeft, SqlBoolean ECMAScript, SqlBoolean CultureInvariant)
{
int Result;
Result =
(IgnoreCase.Value == true ? RegexOptions.IgnoreCase : RegexOptions.None) ||
(MultiLine.Value ? RegexOptions.Multiline : RegexOptions.None) ||
(ExplicitCapture.Value ? RegexOptions.ExplicitCapture : RegexOptions.None) ||
(Compiled.Value ? RegexOptions.Compiled : RegexOptions.None) ||
(SingleLine.Value ? RegexOptions.Singleline : RegexOptions.None) ||
(IgnorePatternWhitespace.Value ? RegexOptions.IgnorePatternWhitespace : RegexOptions.None) ||
(RightToLeft.Value ? RegexOptions.RightToLeft : RegexOptions.None) ||
(ECMAScript.Value ? RegexOptions.ECMAScript : RegexOptions.None) ||
(CultureInvariant.Value ? RegexOptions.CultureInvariant : RegexOptions.None);
return (Result);
}
尝试 2
public static object Iif(bool cond, object left, object right)
{
return cond ? left : right;
}
[SqlFunction(IsDeterministic = true, IsPrecise = true)]
public static SqlInt32 RegExOptionEnumeration(SqlBoolean IgnoreCase, SqlBoolean MultiLine, SqlBoolean ExplicitCapture, SqlBoolean Compiled, SqlBoolean SingleLine, SqlBoolean IgnorePatternWhitespace, SqlBoolean RightToLeft, SqlBoolean ECMAScript, SqlBoolean CultureInvariant)
{
int Result;
Result = Iif(IgnoreCase.Value, RegexOptions.IgnoreCase, RegexOptions.None) || Iif(MultiLine.Value, RegexOptions.Multiline, RegexOptions.None) || Iif(ExplicitCapture.Value, RegexOptions.ExplicitCapture, RegexOptions.None) || Iif(Compiled.Value, RegexOptions.Compiled, RegexOptions.None) || Iif(SingleLine.Value, RegexOptions.Singleline, RegexOptions.None) || Iif(IgnorePatternWhitespace.Value, RegexOptions.IgnorePatternWhitespace, RegexOptions.None) || Iif(RightToLeft.Value, RegexOptions.RightToLeft, RegexOptions.None) || Iif(ECMAScript.Value, RegexOptions.ECMAScript, RegexOptions.None) || Iif(CultureInvariant.Value, RegexOptions.CultureInvariant, RegexOptions.None);
return (Result);
}
【问题讨论】:
-
“但无济于事”究竟是什么意思?
-
telerek 版本有什么问题?
-
在您正在执行的版本中 ||这是逻辑或,但你想要按位或 |因为它将标志转换为存储在 int 中的位域
标签: c# sql-server vb.net clr sqlclr