SQL CLR UDT应如何处理无效输入?

时间:2013-06-05 09:25:45

标签: sql-server exception sqlclr user-defined-types

当SQL Server CLR UDT设置为某个值时,该值(作为字符串)在内部传递给Parse()方法,该方法应该将UDT集的实例返回到传递的任何值 - 字符串值转换为根据该类型的逻辑。到目前为止很好,当输入完全有效时效果很好。

然而,如果传递给它的字符串表示,Parse()应该怎么办?根据类型定义的业务规则无法解析?

作为一个例子,假设我有一种代表书籍ISBN的类型(我说它只是一个例子)。知道ISBN是九位数后跟一个校验位,或“978”后跟九位数后跟一个校验位,很容易定义构成有效ISBN的业务规则。业务要求是系统只应处理有效的ISBN - 任何无效的东西都应立即引发错误(系统以前没有为此构建;它曾用于允许任何唯一且非NULL进入ISBN字段,现在正在收紧)。如果有人输入的字符串不是有效的ISBN,那么在Parse()中采取的适当措施是什么?

我尝试抛出一个ArgumentException,但这会对数据库逻辑的其他部分造成严重破坏,并最终导致应用程序停止运行,原因是未处理的Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements.错误。似乎必须有一个比这更好的方法。

1 个答案:

答案 0 :(得分:1)

投掷ArgumentException似乎是正确的方法 - 请参阅Coding User-Defined Types,特别是解析验证示例:

[SqlMethod(OnNullCall = false)]
public static Point Parse(SqlString s)
{
    if (s.IsNull)
        return Null;

    // Parse input string to separate out points.
    Point pt = new Point();
    string[] xy = s.Value.Split(",".ToCharArray());
    pt.X = Int32.Parse(xy[0]);
    pt.Y = Int32.Parse(xy[1]);

    // Call ValidatePoint to enforce validation
    // for string conversions.
    if (!pt.ValidatePoint()) 
        throw new ArgumentException("Invalid XY coordinate values.");
    return pt;
}