2009-04-20 29 views
1

StudentIDというカスタムデータ型があります。これは暗黙的に文字列に変換されます。ユーザー定義型をSqlParameterCollection.AddWithValueに渡す必要がありますか?

私は(値として)SqlCommand.Parameters.AddWithValueStudentIDインスタンスを渡すと、コマンドを実行すると、私は次のエラーが表示されますSqlDbType.NVarCharのようなパラメータの種類を指定

No mapping exists from object type StudentID to a known managed provider native type. 

は役立ちません。動作する唯一の方法は、明示的にStudentIDの値を文字列にキャストすることです。暗黙のキャストを行う目的を無効にします。

フレームワークでは利用可能なコンバージョンは考慮されません。 StudentIDクラスには、プリミティブ型への明示的なキャストを必要とせずにコマンドを処理できるようにするための何かがありますか?

This MSDN articleは、プリミティブ型の処理方法について説明しますが、ユーザー定義型の取り扱いについては説明していません。最も近いマッチはobjectで、Variantとして渡されます。

正確な障害箇所は、System.Data.SqlClient.MetaType.GetMetaTypeFromValueメソッドにあり、署名はprivate static MetaType GetMetaTypeFromValue(Type dataType, object value, bool inferLen)です。リフレクションでは、プリミティブ型が検索され、TypeCodeがオブジェクトの場合、SqlBooleanなどのSql *データ型が検索されるため、非常に特殊な種類のプリミティブ型やSql *型が検索されているようです。

答えて

1

UDTを渡すことはできません。プリミティブ型またはSQL *型のみが許可されます。

+0

Nullableタイプを導入する主な理由のように、データベースとの間でデータをやりとりすることが難しいと思われるため、Nullable をサポートしていません。 – Triynko

0

SqlUserDefinedTypeAttributeをカスタムタイプと併用しているようです。 の実装をGetMetaTypeFromValueとしてください。

関連する問題