【问题标题】:Validating string lengths based on related database columns根据相关数据库列验证字符串长度
【发布时间】:2009-03-30 01:13:52
【问题描述】:

在我的 Web 应用程序的一端,我有一个存储大量文本的数据库表。

在中间,我有一个分离应用程序层的 API。

在另一端,我有一个由许多TextBoxes(或input type=text 表单元素,如果您愿意的话)组成的用户界面。

我需要TextBoxes 的maxlength 属性与各种相关数据库表列中的最大字符串长度相同。我还想对我的 API 进行字符串长度验证。

当然我可以手动实现,但是有没有人知道任何平台上的技术可以帮助自动设置任何部分?

在我的场景中,我使用的是 ASP.NET 3.5 WebForms、LINQ to SQL 和 SQL Server 2005。

【问题讨论】:

    标签: linq-to-sql tsql language-agnostic validation schema


    【解决方案1】:

    有根本不回答问题的风险......

    您似乎有一条业务规则说“此特定字段最多应包含 N 个字符。”

    我认为数据库列的大小和文本框的最大长度都是此业务规则的独立结果。将一个与另一个固定在一起会混淆相关性和因果关系。

    此外,通过检查数据库列的最大长度来执行此业务规则还有其他效果:

    • 您每次都会访问数据库,否则可能是内存中的验证操作;

    • 如果您的业务规则略有变化(例如:N 从 100 变为 80 个字符),那么您需要进行架构级别的更改;

    • 一些使用可变长度字符编码(如 UTF8)的数据库只能模糊地定义在给定列中甚至可以容纳多少个字符;

    • 更广泛地说,您正在将业务规则耦合到实现工件 - 如果您后来决定使用对象数据库怎么办?

    我并不是建议您不要明智地调整数据库列的大小(您应该),只是建议您将业务规则与数据库实现分离。如果您可以在应用程序代码中进行简单的固定长度检查,我会建议您这样做。

    编辑更仔细地阅读了您的问题,对于您的文本字段最大长度,您在验证之前需要 N。尽管如此,这仍然是一个业务规则——你能为你的字段访问器编写一个MaximumLength 属性并询问它吗?

    【讨论】:

      【解决方案2】:

      我知道你要的是 SQL Server,但在 MYSQL 中,你可以从

      SELECT * FROM information_schema.`COLUMNS` C;
      

      您可以在此处看到一个 CHARACTER_MAXIMUM_LENGTH 字段,该字段提供您想要的内容。

      我相信您可以为 SQL Server 找到类似的东西。

      【讨论】:

        【解决方案3】:

        我认为没有任何开箱即用的解决方案。但是,您可以轻松地在文本框的 MaxLength 属性中添加特殊格式的注释,例如

        <asp:TextBox runat="server" MaxLength="<%--<TABLENAME>.<COLUMNNAME>--%>" />
        

        然后您可以编写另一个程序或 VS 宏来检查您的 aspx 文件并将 MaxLength 设置为该列的长度,以便它变为。

        <asp:TextBox runat="server" MaxLength="20<%--<TABLENAME>.<COLUMNNAME>--%>" />
        

        您可以在添加新字段或更改列大小等时运行此程序。

        【讨论】:

          【解决方案4】:

          您通常可以从数据库请求架构信息,以找出给定列的最大长度。

          看看 SqlDataReader.GetSchemaTable()。它将返回每列的列大小(以及许多其他数据)。调用 Make ExecuteReader() 时将行为参数设置为 KeyInfo。

          另一种方法是直接在sql server中查询数据字典。已经有一段时间了,但我认为 sys (可能是 sys.columns )中的某些内容会包含您正在寻找的信息。

          然后你可以更新文本框属性。

          【讨论】:

            【解决方案5】:

            在 SQL Server 2005(可能还有 2000 和 2008,虽然我没有测试过)中,您可以使用以下查询来查找给定表名和列名的 varchar 字段的长度:

            select 
                t.name TableName,
                c.name ColumnName,
                c.max_length ColumnSize
            from sys.columns c
            inner join sys.tables t on (c.object_id = t.object_id)
            where t.name = 'MyTableName'
                and c.name = 'MyFieldName'
            

            sys.columns 中的 max_length 字段将为您提供文本表单输入字段所需的内容。

            我意识到这并不能回答您关于通过您的 API 实现这一点的问题,它应该让您继续前进。

            【讨论】:

            • 作为上一个答案,我建议您改用信息模式视图,因为它们在不同版本的 SQL 等之间会更加一致。
            猜你喜欢
            • 2013-11-25
            • 2023-04-04
            • 2013-05-16
            • 2020-12-23
            • 2012-01-19
            • 1970-01-01
            • 2016-07-08
            • 2021-11-08
            相关资源
            最近更新 更多