0

MySQLからキャッチしようとしてerror 1045 (access denied)いますが、奇妙な問題がいくつかあります。コードに何か問題がありますか?

例外を処理する代わりに、VS で例外をスローしますか?

private bool connOpen()
{
    bool kleir = false;
    try
    {
        conn.Open();
        kleir = true; // throws exception here
    }
    catch (MySqlException ex)
    {
        switch (ex.Number)
        {
            case 1045:
                MainWindow.connError = true;
                break;
        }
        kleir = false;
    }
    return kleir;
}
4

2 に答える 2

1

これをVSでデバッグしていると仮定します。VSは、デバッグ モードであるため、例外ハンドラーがあっても例外で停止します。これをスタジオの外で実行すると、例外はブロックによって処理されます。続行するには、単に F5 (実行) を押すこともできます。

しかし、私の意見では、それは単なるサイドショーです。あなたが示したコードはかなり悪いです。このスニペットは、単一の接続を開き、それを使用して 1 つ以上の DB 呼び出しを行い、途中で別の方法で接続を閉じることを意味します。

実際に使用している場所から離れた場所で接続を初期化/管理しないでください。接続プールは、多数の接続/切断を適切に処理する以上の能力を備えています。そのコードを一緒に保持する必要がある理由は、単純に、接続のオープン/クローズの間にあるものが多いほど、コードがそれらのオブジェクトを適切に破棄しない可能性が高くなるためです。それらが破棄されないと、接続プールは非常に奇妙でデバッグが困難な問題でクレーターになり、メモリ使用量が大幅に増加します。

接続およびコマンド データベース オブジェクトは管理対象外オブジェクトです。アンマネージ リソースを制御するため、IDisposable を実装します。これを行う正しい方法の例は次のとおりです。

using (SqlConnection conn = new SqlConnection(connstring)) {
  using (SqlCommand cmd = new SqlCommand(conn)) {
    // do atomic database stuff
  }
}

using ステートメントは、これらのオブジェクトを自動的に閉じて破棄します。接続プール (考える必要さえありません) により、上記のコードを 1000 回呼び出しても、超高速で実行されることが保証されます。

于 2013-04-22T22:36:53.293 に答える
0

接続を開こうとすると例外がスローされると思われますが、ダイアログのメニューDEBUG.Exceptions.Common Language Runtime Exceptionsには、列の下にマークされたチェックボックスがありますThrown。これが、コードが示されている行で停止し、catch ブロックに入らない理由です。

于 2013-04-22T22:18:45.367 に答える