根据相关数据库列验证字符串长度

时间:2009-03-26 16:50:36

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

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

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

另一方面,如果您愿意,我的用户界面包含许多TextBox es(或input type=text表单元素。)

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

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

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

5 个答案:

答案 0 :(得分:1)

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

获取你的列
SELECT * FROM information_schema.`COLUMNS` C;

在那里你可以看到一个CHARACTER_MAXIMUM_LENGTH字段,它可以为你提供你想要的东西。

我确信你可以为SQL Server找到类似的东西。

答案 1 :(得分:1)

根本没有回答这个问题的风险......

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

我认为数据库列的大小和文本框的最大长度都是此业务规则的单独结果。从另一个中修复一个会使与因果关系的相关性混淆。

此外,通过检查数据库列的最大长度来实施此业务规则还有其他影响:

  • 您每次都会访问数据库以获取内存中的验证操作;

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

  • 一些使用可变长度字符编码的数据库(如UTF8)只模糊地定义了甚至适合给定列的字符数;

  • 更广泛地说,您将业务规则与实现工件耦合 - 如果您以后决定使用对象数据库会怎样?

我并不是说你没有合理地调整数据库列的大小(你应该),只是你将业务规则与数据库实现分离。如果您可以通过应用程序代码中的简单固定长度检查,我会建议。

编辑已经仔细阅读了您的问题,因为您的文本字段在验证之前需要N个最大长度。尽管如此,这仍然是一个业务规则 - 您可以为您的字段访问者编写MaximumLength属性并询问它吗?

答案 2 :(得分:0)

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

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

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

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

答案 3 :(得分:0)

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

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'

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

我意识到,在通过您的API实现此问题时,这不会回答您的问题,它应该会让您继续前进。

答案 4 :(得分:0)

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

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

然后你可以编写另一个程序或VS宏来浏览你的aspx文件,并将MaxLength设置为该列的长度,使其成为。

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

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