12

SQLServer2008とSQLServer2012の両方をローカルにインストールしている場合は、これを自分で試してみます。ただし、新しいバージョンしかインストールしていないので、そのままにしておきたいと思います。

  • SQL Server 2008にはMicrosoft.SqlServer.Types.dll、メジャーバージョン10のアセンブリが付属しています。
  • SQL Server 2012にはMicrosoft.SqlServer.Types.dll、メジャーバージョン11のアセンブリが付属しています。

特に、両方のアセンブリはSqlGeometryBuilderタイプを公開します。2つのアセンブリバージョンの顕著な違いの1つは、2012タイプには追加のオーバーロードメソッドAddCircularArcがあり、2008タイプにはないことです。

両方のアセンブリを並行して参照することは必ずしも簡単ではありません(おそらく悪い考えです)ので、SQL Server 2008インスタンスに対しても、を使用しない限り、2012バージョンを使用できるかどうか疑問に思いますAddCircularArc

彼らがこれを試した場合、誰かが彼らの経験を共有できますか?

4

2 に答える 2

22

既定では、SqlClient は Microsoft.SqlServer.Types アセンブリのバージョン 10.0 を使用します (プロジェクトで新しいバージョンを参照している場合でも)。そのアセンブリの 2 つの異なるバージョンが同時に読み込まれると、「System.InvalidCastException: タイプ 'Microsoft.SqlServer.Types.SqlGeometry' のオブジェクトをタイプ 'Microsoft.SqlServer.Types.SqlGeometry' にキャストできません」のような奇妙なランタイム例外が表示される場合があります。 '."...

次の記事では、SqlClient で新しい Microsoft.SqlServer.Types アセンブリを使用する必要があるいくつかの可能性について説明します: SQL Server 2012 のデータベース エンジン機能への重大な変更

オプションは次のとおりです。

  • Get メソッドの代わりに GetSqlBytes メソッドを呼び出す (例: SqlGeometry.Deserialize(reader.GetSqlBytes(0)))
  • アプリケーション構成でのアセンブリ リダイレクトの使用
  • 「Type System Version」属性に「SQL Server 2012」の値を指定して、SqlClient にアセンブリのバージョン 11.0 を強制的にロードさせる

個人的には、"Type System Version" 接続文字列キーワードを好みます。こちらの MSDN の記事を参照してください: SqlConnection.ConnectionString プロパティを参照し、 「Type System Version」を検索してください。

于 2013-09-18T20:16:17.160 に答える
7
于 2013-03-05T09:43:45.707 に答える