【问题标题】:How should a SQL CLR UDT handle invalid input?SQL CLR UDT 应该如何处理无效输入?
【发布时间】:2013-05-31 22:25:04
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    抛出 ArgumentException 似乎是正确的方法 - 请参阅 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;
    }
    

    【讨论】:

    • 这是一个有用的链接,我将不得不更仔细地查看该页面。但是,我查看了代码,这几乎正是我已经在做的事情(减去显式验证方法),它给出了问题中显示的错误。
    • 你应该得到一个错误,但不是你在问题中显示的那个 - 我怀疑你没有显示的其他一些代码默默地忽略了真正的错误(应该是 Msg 6522),然后由于假设失败而稍后中断。
    猜你喜欢
    • 2018-08-25
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    相关资源
    最近更新 更多