Эти два метода ниже похожи, за исключением того, что один обрабатывает нулевые значения, а другой — нет. Для обработки нулевых значений он использует тип SqlString и проверяет свойство get_IsNull.
Почему первый может вызывать ошибку "A .NET Framework error occurred during execution of user-defined routine or aggregate "CheckMailingAddress": ."
при запуске внутри SQL CLR, а второй - нет?
В частности, ошибка 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.
Вероятно, я мог бы также реализовать первый метод, используя «строку», и по-прежнему выполнять проверку на нулевое значение, но он использует SqlString, чтобы воспользоваться преимуществами свойств интерфейса INullable «IsNull» и «Value», поскольку он является частью общего генератора кода, где другие Можно использовать типы Sql*.
РЕЗЮМЕ ПРОСТОЙ ПРОБЛЕМЫ:
Для тех, кого отвлекает MSIL в теле метода; игнорируй это. Я перекомпилировал функции, чтобы они вообще ничего не делали, и моя точка зрения заключается в том, что когда "SqlString", а не "string", является типом ввода, CLR взрывается и завершается без сообщения об ошибке, а возвращаемое значение равно NULL, а не ПРАВДА.
//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
}