どのように私はSqlParameterCollection.AddWithValueにユーザー定義型を渡す必要がありますか?
-
12-09-2019 - |
質問
私は、文字列への暗黙的な変換を持っているStudentID
と呼ばれるカスタムデータ型を、持っています。
私は(値として)StudentID
とコマンドを実行するSqlCommand.Parameters.AddWithValue
インスタンスを渡すと、私は次のエラーが表示されます
No mapping exists from object type StudentID to a known managed provider native type.
は役立ちませんSqlDbType.NVarChar
のようなパラメータの種類を指定します。働く唯一のことは、明示的、暗黙的なキャストを持つことの目的に反し文字列にStudentID
値をキャストすることです。
私は、フレームワークが利用可能な変換を考慮していないと思います。私は、コマンドがプリミティブ型に明示的なキャストを必要とせずにそれを処理するためにStudentID
クラスに何かできることはありますか?
、ではなく、ユーザー定義型。最も近い一致は、それがバリアントとして渡されると言うオブジェクト、となります。
故障の正確なポイントは、署名private static MetaType GetMetaTypeFromValue(Type dataType, object value, bool inferLen)
と、System.Data.SqlClient.MetaType.GetMetaTypeFromValue方法です。リフレクションは、プリミティブタイプを探し、typecodeがオブジェクトである場合、そのようなたSqlBooleanとしてSQL *データ型を探し、それが*プリミティブまたはSQLタイプの非常に特定の種類を探しているように見えることが明らかになっています。
解決
あなたはのUDTを渡すことはできません。唯一のプリミティブまたはSQL *タイプが許可されています。
他のヒント
あなたのカスタムタイプでSqlUserDefinedTypeAttribute
を使用することができそうです。 GetMetaTypeFromValue
のの現在のの実装を見てみましょう。