非常に奇妙な問題があります。SqlCommand.ExecuteNonQuery を使用して C# から特定のデータベース ストアド プロシージャを実行すると、ストアド プロシージャが実行されません。
さらに、SQL プロファイラーはコマンドをまったく登録しません。コマンド タイムアウトを受信せず、例外もスローされません。
最も奇妙なことは、このコードが 1,200,000 回以上正常に機能したことですが、データベースに挿入しようとしているこの 1 つの特定のファイルについては、永遠にハングアップするだけです。
アプリケーションを強制終了すると、データベース サーバーのイベント ログに次のエラーが表示されます"A fatal error occurued while reading the input stream from the network. The session will be terminated (input error: 64, output error: 0).。 SQL プロファイラーはそうではないと言っていますが、データベース サーバーがコマンドを受信していると思われます。
適切なアクセス許可が設定されていること、およびこのコードとストアド プロシージャが他のファイルで正常に動作するため、接続文字列が正しいことを知っています。
以下は、ストアド プロシージャを呼び出すコードです。挿入しようとしているファイルが 33.5 MB であることに注意することが重要かもしれませんが、500 MB を超えるファイルを 10,000 個以上追加したため、サイズは問題ではないと思います。 :
using (SqlConnection sqlconn = new SqlConnection(ConfigurationManager.ConnectionStrings["TheDatabase"].ConnectionString))
using (SqlCommand command = sqlconn.CreateCommand())
{
command.CommandText = "Add_File";
command.CommandType = CommandType.StoredProcedure;
command.CommandTimeout = 30 //should timeout in 30 seconds, but doesn't...
command.Parameters.AddWithValue("@ID", ID).SqlDbType = SqlDbType.BigInt;
command.Parameters.AddWithValue("@BinaryData", byteArr).SqlDbType = SqlDbType.VarBinary;
command.Parameters.AddWithValue("@FileName", fileName).SqlDbType = SqlDbType.VarChar;
sqlconn.Open();
command.ExecuteNonQuery();
}
呼び出しを行っているサーバーとデータベース サーバーの間にファイアウォールはなく、この問題をトラブルシューティングするために Windows ファイアウォールが無効になっています。