以下のエラー事象が発生した場合は、データベースの切り替えが発生した可能性があります。この場合、コネクションの再接続を行って、トランザクションを再実行してください。
NpgsqlExceptionの属性Codeに"57P01"が返却される。
NpgsqlExceptionの属性Codeに空文字列が返却される。
NullReferenceExceptionが発生する。
NpgsqlConnection conn = new NpgsqlConnection(~);
conn.Open();
…
try
{
NpgsqlCommand command = new NpgsqlCommand("~", conn);
}
catch (NpgsqlException e)
{
if (e.Code.Equals("57P01") || e.Code.Equals(""))
{
try
{
conn.Close();
}
catch {}
// 再接続処理へ
}
else
{
throw e; //その他のエラー
}
}
catch (NullReferenceException e)
{
try
{
conn.Close();
}
catch {}
// 再接続処理へ
}
catch (Exception e)
{
throw e; //その他のエラー
}注意
データベースの切り替えが完了するまでは、コネクションの接続がエラー終了し、NpgsqlExceptionの属性Codeが空文字列のエラーが返されます。
5秒間隔で20回、再接続をリトライする場合。
int count = 0;
NpgsqlConnection conn = new NpgsqlConnection(~);
do
{
count++;
try
{
conn.Open();
// 再接続完了
}
catch (NpgsqlException e)
{
if (!e.Code.Equals("") || count> 20)
{
throw e; // 再接続失敗
}
}
try
{
Thread.Sleep(5000);
}
catch (Exception e)
{
}
} while (true);