39

次のコードは、ジェネリック (SortedDictionary) から派生した UDT を実装します。

[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedType(Format.UserDefined, MaxByteSize = 8000)]
public class udtMassSpectra : SortedDictionary<float, float>, INullable, IBinarySerialize, ICloneable, IDisposable
{
...
}

型の作成 (T-SQL):

CREATE TYPE dbo.udtMassSpectra EXTERNAL NAME MassSpectra.udtMassSpectra;

例外をスローします:

メッセージ 10331、レベル 16、状態 1、行 1 アセンブリ 'MassSpectra' の型 'udtMassSpectra' は、CLR 型でサポートされていないジェネリック型から派生しています。

理由は何ですか?プライベート メンバー内で基本クラスを非表示にする以外に回避策はありますか? このコードは、SQL Server 2005 で正常に動作します。

4

3 に答える 3

1

もう1つの提案:

型がクラスとして定義されていること、プリミティブ、ネスト、またはジェネリックでないことを確認します

PS:

「MSSQL 2005 で作業したが、MSSQL 2008 では作業しなかった」という限りでは、Tom Petty の言葉を引用します。;)

于 2012-06-26T17:39:13.207 に答える
0

私は UDT の経験がありませんが、おそらく問題は float が SQL-Server の NULL 値を表すことができないことです。

私はいくつかの研究を行い、ここにこれを見つけました

于 2012-04-13T14:49:43.613 に答える
0

SortedDictionary<float, float>UDT にのインスタンスを格納することで、この制限を非常に簡単に回避できます。

好奇心から、列のデータ型、変数などとして、T-SQL コンテキストでジェネリック クラスがどのようにインスタンス化されるかを確認したいと思います。

于 2012-05-23T21:14:32.777 に答える