2

クライアントの 1 つは、SQL Server 2005 バックエンド上でアプリケーション (FoxPro 9) を実行しています。断続的に、SQL Server データベースとの ODBC 接続が失われています。以下は初期エラー情報です。

エラー メッセージ: 接続エラー: [Microsoft][ODBC SQL Server ドライバー][DBNETLIB]ConnectionRead (recv())。

ODBC エラー メッセージ: [Microsoft][ODBC SQL Server ドライバー][DBNETLIB]ConnectionRead (recv())。

SQL 状態: 01000

ODBC エラー番号: 10054

ODBC ハンドル: 1

FoxPro エラー番号: 1526

コマンドでこのエラーを再現することはできません。私たちは何度も解決策を試しましたが、役に立ちませんでした。私たちが見つけたそのようなハードウェア ベース ソリューションの 1 つは、http ://support.microsoft.com/kb/942861/en-us に記載されています。

これについて言及するのは、これまで見てきたものとほぼ完全に一致するからです。ただし、その投稿 (およびこの投稿http://support.microsoft.com/kb/948496 )に記載されているすべての回避策を実装しましたが、問題は引き続き発生します。

この問題は、実行時間の長いクエリの実行後に現れるようですが、アプリケーションまたは SQL Server からタイムアウト エラーを受け取っていません。プログラムの実行中にアイドル タイムアウトが発生することがあるからです。

私はハードウェアの専門家ではありませんが、ネットワークとサーバー (Windows Server 2003) の両方が高速で、適切に設計されているようです。ただし、データベース サーバーに大きな負荷がかかる場合があります。

私たちが試すことができることについて誰か提案があれば...私たちに知らせてください!

4

4 に答える 4

1

pbアプリケーションとmssqlをdbとして使用し、2つのトランザクションオブジェクトを最初から設定します。1つの関数は、最初のトランザクションを使用してカーソルをループし、このループ内で、2番目のトランザクションオブジェクトを使用して別のテーブルを更新します。update(2番目のトランザクションobj)の後に明示的なコミットが使用されない場合、最初の接続がシャットダウンされ、[Microsoft] [ODBCSQLServerドライバー][DBNETLIB]ConnectionRead(recv())エラーが発生します。対応するトランザクションの適切なcommitステートメントを呼び出すと、すべてが魅力のように機能しました。 そして、はい、エラーは常に実際にクラッシュする場所の前のどこかにあります-デバッグモードであると仮定します。Sybaseが、2番目のトランザクションオブジェクトに対して明示的にコミットを発行する必要なしに、適切なトランザクションを閉じる/開くことができたのは興味深いことです!!!!

于 2013-01-03T20:32:26.197 に答える
1

暗闇の中でのショットですが、トレースを実行して、エラー イベントと tsql をキャプチャしようとしましたか。これは、いくつかの手がかりを提供したり、パターンを確認するのに役立ちます。

于 2009-01-08T18:08:32.487 に答える
1

この質問のフォローアップです...部分的な解決策があります。

私はトレースを実行しましたが、実際にはいくつかのトレースがありました。私が見つけたのは、これらのエラーには複数の原因があるように見えるということです。それらの 1 つを見つけて修正できましたが、他の場所でこのエラーが引き続き発生し、実行したトレースには表示されません。

それで、私が見つけたものとの取引は何でしたか?さて、トレースから、次の ODBC エラーが別の SQL Server エラーの後に表示されることがわかりました。

Error: 1203, Severity: 20, State: 1.
Process ID 94 attempted to unlock a resource it does not own: OBJECT: 25:1699834390:0 . Retry the transaction, because this error may be caused by a timing condition. If the problem persists, contact the database administrator.

FoxPro コードから、insert ステートメントがこのエラーの原因であることがわかりました...常にではありませんが、時々. この挿入では、1 つのテーブルからすべてのフィールドを取得し、別のテーブルから一部のフィールドを取得して、3 つ目のテーブルに追加しました。このデータベースのすべてのテーブルには id_col という ID 列があり、3 番目のテーブルにデータを入力する select ステートメントは 2 つの id_col フィールドを返していました。

insert into tablethree 
select a.*, b.price, b.item, id_col 
from tableone a, tabletwo b 
where a.item = ....

1 つの id_col のみが返されるようにコードを再構築すると、エラーは停止しました。

正直に言うと、このエラーには、私が同時に修正した別の要因が考えられます。このクエリの直前a.item+a.customer = lc_item+lc_customerに、SQL サーバー クエリで Foxpro Rushmore 構文 (例: ) を使用する別の大きな/長いクエリがありました。以前にこの種の問題が発生したことがあるので、それが問題の原因である可能性があります...しかし、余分な ID 列が原因であるという証拠が非常に支持されています。

于 2009-03-06T01:20:53.913 に答える
0

完全な解決策にたどり着いたかどうかはわかりませんが、ネットワーク接続が中断されるかどうかを調べましたか? 私が開発していた VFP プログラムの 1 つが、ラップトップを使用しているユーザーに対して非常に頻繁に SQL 接続を失い始めました。ラップトップが一時的にネットワーク接続を失っていたようです。接続が数秒間失われただけでも、VFP のハンドルをリセットする必要があります。これがあなたの正確な問題かどうかはわかりませんが、私と同じように聞こえました。

于 2009-04-13T14:15:01.737 に答える