2009-07-27 21 views
3

varchar(1) NULLフィールドで定義されたSQL Serverテーブルを考えます。性別を保存するために使用されています。一部の行にはデータが含まれています。与えられた空白はnullsであるべきであるが、空白はここで有効な値であると考えるべきである。私は値がヌルであることを好むでしょう。Linq to Sql:例外 "文字列は1文字長でなければなりません"

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

someIDの値が3

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

例外あるLINQのSQLへのクエリの実行時に例外が発生する:文字列が正確に1文字でなければなりません

を。

質問:この例外の原因は何ですか?この問題を防止または排除するために何ができるのですか?

+0

SQL ServerでChar(1)を使用しないのはなぜですか? –

+2

@ Dan - 既存のデータベーススキーマを変更して、生成されたファイルをより簡単に変更できるようにするのは意味がないためです。 LINQ to SQLデザイナーがChar for varchar(1)を使用しているという事実は、私の意見ではバグです。 –

答えて

15

LINQ to SQLデザイナーによって作成されたEmployeeのタイプを確認してください。ほとんどの場合、GenderプロパティのタイプはにはLINQ to SQLデザイナーが使用するタイプのSystem.Charであり、データベーススキーマに適切に一致するようにSystem.Stringに変更する必要があります。

LINQ to SQLデザイナがSystem.Charとしてvarchar(1)を解釈しているという事実は、これが有効なT-SQLであることを考慮すると、愚かである:

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

、これは無効 C#のである:

Char foo = ''; 

生成されたプロパティのタイプがあまりにも制限的なので、System.Stringに変更する必要があります。

注:あなたは、文字列の長さが1よりも大きい場合に例外をスローするには、プロパティのセッター内のいくつかの検証を追加することを検討することをお勧めします。

+0

詳細情報と大きな説明はこちら:http://dotnetslackers.com/XLinq/re-63043_LINQ_Error_String_must_be_exactly_one_character_long.aspx –

+0

... varchar(1)フィールドが多い場合は、http: //www.huagati.com/dbmltools/は、これらのフィールドのマッピング(charからstringへのマッピング)を自動的に修正します。 – KristoferA

0

''のような空白のデータがテーブルの現在の制約を満たしていない可能性はありますか?例えば。おそらくテーブルは空の文字列を(たとえそこに1つありますが)許可しません。

次に、LINQがこれらの制約を適用しているか、それらの制約が満たされていないと不平を言うことを期待しているかもしれません。これは何が起こっているかであるならば、あなたは空白の値を許可するために、テーブルの制約/デザインを変更、または単にNULLにすべての空白値を更新する可能性があります

(仮定にNULLが許可されている)

0

この問題が発生しますLinq To SQL Designerがストアドプロシージャの結果を保持するための結果クラスを自動的に生成しようとするとき。自動生成されたクラスを独自の新しいクラスファイルにコピーして(同じ名前を使用)、そこに変更を加えます。 DataContextを更新するたびに、自動的に生成されたクラスが削除されます。理想的なソリューションではなく、2008年の回避策です。

関連する問題