Linq To Sql:异常“字符串必须正好一个字符”

时间:2009-07-27 20:05:26

标签: c# sql-server linq-to-sql

考虑使用varchar(1) NULL字段定义的SQL Server表。它被用来存储性别角色。有些行有数据,有些没有:null或空白。当然空白应该是空值,但在这里考虑空白是一个有效值。我更喜欢这个值为null。

ID    Gender
1      'M'
4      'M'
3      ''
4      'F'

运行Linq To Sql查询时会引发异常,someID的值为3。

var emp = (from e in db.Employees
           where e.ID == someID
           select e);

异常

  

字符串必须正好一个字符。

问题:此异常的原因是什么?如何防止或消除这个问题?

3 个答案:

答案 0 :(得分:15)

检查LINQ to SQL设计器为您创建的Employee类型。很可能Gender属性的类型是System.Char(这是LINQ to SQL设计器用于varchar(1)的类型),应该更改为System.String以正确匹配您的数据库架构。

考虑到这是有效的T-SQL,LINQ to SQL设计者将varchar(1)解释为System.Char的事实是愚蠢的:

declare @foo varchar(1);
set @foo = '';

这是无效 C#:

Char foo = '';

由于生成的属性类型限制性太强,您需要将其更改为System.String

注意: 您可能需要考虑在属性的setter中添加一些验证,以便在字符串的长度大于1时抛出异常。

答案 1 :(得分:0)

像''这样的空白数据是否可能不符合表格的当前限制?例如。也许表格不允许空字符串(即使那里有一个字符串)。

然后,也许LINQ正在为您应用这些约束,或者期望满足这些约束并抱怨它们不是。

如果这是正在发生的事情,您可以更改表的约束/设计以允许空值,或者只是将所有空值更新为NULL(假设允许NULL)

答案 2 :(得分:0)

当Linq To SQL Designer尝试自动生成结果类以保存存储过程结果时,也会发生此问题。将自动生成的类复制到您自己的新类文件中(使用相同的名称)并在那里进行更改。每次更新DataContext时,只会删除自动生成的类。不是一个理想的解决方案,而是2008年的解决方案。