下面这两种方法很相似,只是一种处理空值,而另一种不处理。为了处理空值,它使用SqlString类型并检查“get_IsNull”属性。
为什么第一个方法在SQL CLR内运行时会导致错误“在用户定义的例程或聚合“CheckMailingAddress”执行期间发生了.NET Framework错误。”,而第二个方法则不会?
特别是,TSQL错误是“Msg 10329,Level 16,State 49,Line 1 .Net Framework execution was aborted.”
请注意,据我所知,MSIL是正确的,因为这两种方法在独立应用程序中调用时都可以工作。只有在SQL CLR内部调用时,第一个方法才会崩溃。在SQL CLR中,该函数使用"nvarchar(4000)"类型定义,据我所知,这应该与SqlString兼容。
我可以尝试使用"string"来实现第一种方法并进行空值检查,但它使用SqlString来利用INullable接口属性"IsNull"和"Value",因为它是通用代码生成器的一部分,其他Sql*类型也可以使用。
简单问题概述:
对于那些被方法体中的MSIL所分散注意力的人们,请忽略它。我重新编译了函数,什么也没做,我的观点是,当输入类型为"SqlString"而不是"string"时,CLR会崩溃并终止,没有错误消息,并且返回值为NULL而不是TRUE。
为什么第一个方法在SQL CLR内运行时会导致错误“在用户定义的例程或聚合“CheckMailingAddress”执行期间发生了.NET Framework错误。”,而第二个方法则不会?
特别是,TSQL错误是“Msg 10329,Level 16,State 49,Line 1 .Net Framework execution was aborted.”
.method public hidebysig static bool CheckMailingAddress(valuetype [System.Data]System.Data.SqlTypes.SqlString param0) cil managed
{
.maxstack 8
L_0000: ldarga.s param0
L_0002: nop
L_0003: nop
L_0004: call instance bool [System.Data]System.Data.SqlTypes.SqlString::get_IsNull()
L_0009: brfalse L_0010
L_000e: ldc.i4.1
L_000f: ret
L_0010: ldarga.s param0
L_0012: nop
L_0013: nop
L_0014: call instance string [System.Data]System.Data.SqlTypes.SqlString::get_Value()
L_0019: call class DatabaseValues.MailingAddress DatabaseValues.MailingAddress::op_Explicit(string)
L_001e: pop
L_001f: ldc.i4.1
L_0020: ret
}
.method public hidebysig static bool CheckMailingAddress(string param0) cil managed
{
.maxstack 8
L_0000: ldarg.0
L_0001: call class DatabaseValues.CheckMailingAddress DatabaseValues.CheckMailingAddress::op_Explicit(string)
L_0006: pop
L_0007: ldc.i4.1
L_0008: ret
}
请注意,据我所知,MSIL是正确的,因为这两种方法在独立应用程序中调用时都可以工作。只有在SQL CLR内部调用时,第一个方法才会崩溃。在SQL CLR中,该函数使用"nvarchar(4000)"类型定义,据我所知,这应该与SqlString兼容。
我可以尝试使用"string"来实现第一种方法并进行空值检查,但它使用SqlString来利用INullable接口属性"IsNull"和"Value",因为它是通用代码生成器的一部分,其他Sql*类型也可以使用。
简单问题概述:
对于那些被方法体中的MSIL所分散注意力的人们,请忽略它。我重新编译了函数,什么也没做,我的观点是,当输入类型为"SqlString"而不是"string"时,CLR会崩溃并终止,没有错误消息,并且返回值为NULL而不是TRUE。
//Crashes when input parameter is "SqlString"
.method public hidebysig static bool CheckMailingAddress(valuetype [System.Data]System.Data.SqlTypes.SqlString param0) cil managed
{
.maxstack 8
L_001f: ldc.i4.1
L_0020: ret
}
//Doesn't Crash when input parameter is "string"
.method public hidebysig static bool CheckMailingAddress(string param0) cil managed
{
.maxstack 8
L_0007: ldc.i4.1
L_0008: ret
}