Linq to sql 基于相关数据库列验证字符串长度

Linq to sql 基于相关数据库列验证字符串长度,linq-to-sql,tsql,language-agnostic,validation,schema,Linq To Sql,Tsql,Language Agnostic,Validation,Schema,在我的web应用程序的一端,我有一个存储大量文本的数据库表 在中间,我有一个分离应用层的API 在另一端,我有一个由许多TextBoxe组成的用户界面(或者input type=text表单元素,如果您愿意的话) 我需要TextBoxes的maxlength属性与各种相关数据库表列中的最大字符串长度相同。我还想对我的API进行字符串长度验证 当然,我可以手动实现这一点,但是否有人知道任何平台上有一种技术可以帮助自动设置这一部分 在我的场景中,我使用的是ASP.NET 3.5 WebForms、L

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

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

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

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

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


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

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

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

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


然后您可以更新textbox属性。

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

SELECT * FROM information_schema.`COLUMNS` C;
在这里,您可以看到一个字符最大长度字段,它提供了您想要的内容

我相信您可以在SQL Server中找到类似的内容。

在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实现这一点的问题,它应该会让您上路。

冒着根本不回答这个问题的风险

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

我认为数据库列的大小和文本框的最大长度都是这个业务规则的独立结果。将两者区分开来会混淆因果关系

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

  • 您每次都会访问数据库,以执行内存内验证操作

  • 如果您的业务规则略有更改(例如:N从100个字符变为80个字符),那么您需要一个模式级别的更改

  • 一些使用可变长度字符编码(如UTF8)的数据库只能模糊地定义给定列中的字符数量

  • 更广泛地说,您正在将业务规则耦合到一个实现工件——如果您以后决定使用对象数据库呢

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


编辑仔细阅读您的问题后,对于文本字段的最大长度,您需要在验证前输入N。尽管如此,这仍然是一条业务规则-您是否可以为字段访问器编写
MaximumLength
属性并进行查询

我认为没有现成的解决方案。然而,您可以轻松地在文本框的MaxLength属性中添加一个特殊格式的注释,例如

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

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

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


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

如前所述,我建议您改用信息架构视图,因为它们在不同版本的SQL等之间更加一致。