0

弊社の .NET 2.0 シック クライアント アプリを使用しているお客様の中には、SQL 2000 SP4 サーバーからデータを読み取る際に奇妙で断続的なエラーが発生するものがあります。これらのエラーが発生しない SQL 2000 を使用している一部の顧客 (および 2005 を使用している顧客の多く) がいます。

私が気づいたことの 1 つは、テスト環境のアプリが System.Data 2.0.50727 を参照していることです。3053 ; 一方、アプリは 2.0.50727 を参照します。お客様のシステムでは1433 。これらの 2 つのリビジョンの違いは何ですか? また、それは以下に説明するエラーに関連している可能性がありますか?

列挙値が 8 であるエラーのスタック トレースの例を次に示しますが、まったく同じスタック トレースで「範囲外」の列挙値が 4 または 14 であるインスタンスが他にもたくさんあります。列挙値が見つかる場合もあれば、見つからない場合もありますか? アプリの同じ部分がエラーなしで実行された場合はどうでしょうか?

TYPE: System.ArgumentOutOfRangeException
MSG: The SqlDbType enumeration value, 8, is invalid.
Parameter name: SqlDbType
SOURCE: System.Data
SITE: GetSqlDataType

at System.Data.SqlClient.MetaType.GetSqlDataType(Int32 tdsType, UInt32 userType, Int32 length)
at System.Data.SqlClient.TdsParser.CommonProcessMetaData(TdsParserStateObject stateObj, _SqlMetaData col)
at System.Data.SqlClient.TdsParser.ProcessMetaData(Int32 cColumns, TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.NextResult()
at Ceoimage.Basecamp.Data.Document._GetDocumentModelWithCollections(IDataReader rdr)

更新:クライアントのワークステーションの 1 つから System.Data をダウンロードしました。GAC には 2 つのバージョンがあり、1 つは GAC ディレクトリに、もう 1 つは GAC_32 ディレクトリにありました。GAC では、バージョン番号は 1.14322.2365 です。GAC_32 では、バージョン番号は前述のように 2.0.50727.1433 です。ただし、3 つのバージョンすべてで、SqlDbType 列挙型は同じ int 値をエラー メッセージ内の同じ型にマップします。

DateTime = 4
Int = 8
UniqueIdentifier = 14

問題がフレームワークのバージョンに関係している場合、問題は一時的なものではなく、100% の確率で発生するのではないでしょうか?

4

3 に答える 3

3

この古くからの議論は、あるスレッドで作成された接続を使用して別のスレッド内でクエリを実行するという同様のエラーを追跡しています。SqlConnection 「インスタンス メンバーはスレッド セーフであることが保証されていません」 . アプリケーションがマルチスレッドの場合は、接続が適切に使用されていることを確認してください。

問題は、最近のバージョンで解決された SQL サーバー側の何かである可能性もあります。

SQL 2005 で SqlCommand.Cancel を使用しているときにこのエラーが発生したため、ここで回答しています。 「サーバーからの予期しない応答」エラーとして...発生した場合は、接続プールをクリアすることをお勧めします。

長時間実行されているデータベース操作をキャンセルする方法は?

接続プールを使用しているときに、SqlConnection を物理的に閉じるにはどうすればよいですか?

于 2011-11-07T16:21:21.463 に答える
2

クライアントは、3.5 がインストールされていない .NET 2.0 上にあります。テスト サーバーは 3.5 です。3.5 で列挙に追加されたものは次のとおりです。

Structured
Date
Time
DateTime2
DateTimeOffset

これは、根本的な変更がないことを意味するものではありません。

可能であれば、3.5 をインストールせずに 2.0 でアプリをテストし、どのようなエラーが発生するかを確認します。それはあなたに良い出発点を与えるはずです。

エラーのポイントを把握するには、列挙を反復処理して、列挙内のアイテムの順序を確認する必要があります。Reflector はこれを行うための優れたツールですが、変更を確認するには 2.0 システムと 3.5 システムの両方で行う必要があります。

于 2009-03-13T15:31:12.173 に答える
0

この解決策はあなたの問題を解決するかもしれません:

ローカル ボックスは SQL Server 2008 を使用していますが、他のボックスは 2005 ですか? @RUNTIME パラメータは SqlDbType.Time 型です。そのタイプは SQL Server 2005 には存在しませんでした。例外として、SqlDbType.Time の値は 32 です。SQL Server 2008 より前の時間の値だけを保存することはできません。2005 年には @RUNTIME を SqlDbType.DateTime として保存する必要があります。

また、.NET Framework 2.0を使用する場合、この問題を解決するには、 .NET Framework 2.0 SP2と sql2008 を インストールする必要があります。

于 2013-09-29T09:59:01.493 に答える