0

137 個のフィールドを持つ非常に大きなテーブルがあります。VB の Record オブジェクトでこのテーブルのレコードを作成し、LINQ to SQL でそれらを挿入しようとしています。しかし、1 つ以上のフィールドが長すぎるため、レコードを挿入できません。linq to sql を使用して挿入しようとすると、次のエラーが表示されます。文字列またはバイナリ データが切り捨てられます。ステートメントは終了されました。

エラー メッセージの詳細を確認しましたが、どのフィールドが長すぎるかわかりません。

この問題を解決するには、リフレクションを使用して Record オブジェクトの各フィールドの各値をループし、長すぎるかどうかを確認します。そのためには、linq から sql オブジェクトへの最大フィールド長にプログラムでアクセスする必要があります (したがって、最大サイズが何であるかがわかります)。これどうやってするの?特定の linq to sql オブジェクトの GUI では、各フィールドに最大値を格納する serverdatatype プロパティがあることがわかります。コードでこれにアクセスするにはどうすればよいですか?

4

1 に答える 1

2

プロパティの属性を取得し、DbType適用されたプロパティColumnAttributeを調べて「長さ」を調べる必要があります。例えば

Account acc = new Account();
ColumnAttribute[] att = acc.GetType().GetProperty("CreditCardNumber").GetCustomAttributes(typeof(ColumnAttribute), false) as ColumnAttribute[];

上記には、Account タイプ (アカウント テーブルにマップされる) と CreditCardNumber プロパティ (CreditCardNumber 列にマップされる) があります。このプロパティには、L2S によって適用される ColumnAttribute があります。

ColumnAttributeが適用された場合、att上記には 1 つのColumnAttributeオブジェクトが含まれます。DbType'att[0].DbType' でそれが何であるかを知ることができます。たとえば、これは「NVarChar(100)」のようになります。それを解析して 100 を得ることができます。

アップデート:

MetaModelデータ コンテキストに関連付けられたオブジェクトを使用することもできます。たとえば、 という名前のデータ コンテキストが既にある場合dbContext、次のように DbType を取得できます。

 dbContext.Mapping.GetTable(typeof (Account)).RowType.GetDataMember(typeof (Account).GetProperty("CreditCardNumber")).DbType;

「NVarChar(100)」テキストを解析する必要があります。

于 2012-09-06T15:59:38.077 に答える