2

IIS7からのServer2008に対するSQLクエリに問題があります。更新ステートメントを実行するVB.NETクラスライブラリがあります。接続の作成に使用される基になるコードは変更されていませんが、テスト環境と開発環境で突然クエリが失敗します。ただし、本番環境で少し古いコードを使用しても、同じサーバー/データベースに対しては機能します。

web.configで接続タイムアウトを設定しようとしましたが、原因を説明できません。

クエリの基本構造は次のとおりです。

Dim conn = New SqlConnection()
conn.ConnectionString = "Data Source=someserver\sqlexpress2008;Initial Catalog=DatabaseName;User ID=sa;Password=pass"
conn.Open()
Using cmd As SqlCommand = conn.CreateCommand()
    cmd.CommandText = "UPDATE ..."
    cmd.Parameters.AddWithValue("@UName", user.name)
    cmd.ExecuteNonQuery() 'fails with error
End Using

エラーは次のとおりです。

サーバーにリクエストを送信するときに、トランスポートレベルのエラーが発生しました。(プロバイダー:TCPプロバイダー、エラー:0-既存の接続がリモートホストによって強制的に閉じられました。)

IISとSQLサーバーを再起動しようとしましたが、まったく考えがありません。修正が必要です

4

5 に答える 5

2

を呼び出す前に接続を開く必要がありますSqlCommand.ExecuteNonQuery()。これを行うには、を呼び出しSqlConnection.Open()ます。

Dim conn = New SqlConnection() 
conn.ConnectionString = "Data Source=someserver\sqlexpress2008;Initial Catalog=DatabaseName;User ID=sa;Password=pass" 
Using cmd As SqlCommand = conn.CreateCommand() 
    cmd.CommandText = "UPDATE ..." 
    cmd.Parameters.AddWithValue("@UName", user.name) 

    conn.Open()
    cmd.ExecuteNonQuery() 'fails with error 
    conn.Close()
End Using 

また、データベースがシングルユーザーモードになっていないことを確認してください。

于 2012-01-31T14:26:10.720 に答える
2

これは最近立ち往生している別の人を助けました。SQL Server Profilerを設定することにより、データベースサーバーから問題を調べることができます。

ぐるぐる回るだけで、SQLプロファイラーに関する多くの情報を見つけることができます。これがあなたが始めるのを助けるかもしれないビデオのあるサイトです。手始めに、リクエストがデータベースサーバーに到達しているかどうかを確認できます。

于 2012-01-31T14:38:18.217 に答える
2

これは追跡するのに悪夢でした。これは、VB.NETのひどい癖が原因であることが判明しました。null許容の日時が強制されているようでDateTime.MinValue、その結果DateTime.MinValue、SQLに挿入されましたdatetime。修正は!property.HasValue && property.Value != DateTime.MinValue、コマンドのパラメーターを設定するときにどちらかをチェックすることでした。

于 2012-01-31T15:40:46.583 に答える
0

これはネットワークレベルのエラーです。データベースサーバーが何らかの理由で接続を切断しています。これをトラブルシューティングするために、SSMSを使用してDEVサーバーとTESTサーバーへの接続を開き、問題のない単純なクエリを実行できることを確認します。タイムアウトやその他の種類のエラーが発生するため、ライブラリに問題がある可能性はほとんどありません。

于 2012-01-31T14:28:13.327 に答える
0

Lcarusが言ったように、データベースサーバーは未知の理由で接続を切断しています。ログを確認して確認できます。ログパスはC:\Program Files\Microsoft SQL Server\<your instance>\MSSQL\LOG

MSDNブログからMSDN ブログ

これは、接続が接続プールから取得され、アプリケーションが物理接続が切断されたことを認識しない場合に発生します。これを使用する試みは、物理接続がまだ存在することを前提として行われます。

于 2012-01-31T15:08:59.220 に答える