1

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

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

作为一个例子,假设我有一个代表一本书的 ISBN 的类型(我说这只是一个例子)。知道 ISBN 是 9 位后跟 1 位校验位,或者“978”后跟 9 位后跟一位校验位,因此很容易定义构成有效 ISBN 的业务规则。一个业务要求是系统只能处理有效的 ISBN——任何无效的都应该立即引发错误(并且系统以前不是为此而构建的;它曾经允许任何唯一且非 NULL 的内容进入 ISBN 字段,现在正在收紧)。如果有人输入了一个不是有效 ISBN 的字符串,那么在 Parse() 中采取的适当操作是什么?

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

4

1 回答 1

1

抛出 anArgumentException似乎是正确的方法 - 请参阅Coding User-Defined Types,特别是 Parse Validation Example:

[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;
}
于 2013-06-05T09:44:41.623 回答