当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.
错误。似乎必须有一个比这更好的方法。
答案 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;
}