5

Windowsフォームアプリケーションで独自の例外を作成したい. データベースにデータを追加しようとしています。

コード:

try
{
    string insertData = string.Format("INSERT INTO " + constants.PIZZABROADCASTTABLE + 
      " VALUES(@starttime,@endtime,@lastupdatetime,@applicationname)");
    sqlCommand = new SqlCommand(insertData, databaseConnectivity.connection);
    sqlCommand.Parameters.AddWithValue("@starttime", broadcastStartDateTime);
    sqlCommand.Parameters.AddWithValue("@endtime", broadcastEndDateTime);
    sqlCommand.Parameters.AddWithValue("@lastuptime", currentDateTime);
    sqlCommand.Parameters.AddWithValue("@applicationname", txtApplicationName.Text);
    sqlCommand.ExecuteNonQuery();
}
catch (DataBaseException ex)
{
    MessageBox.Show(ex.Message);
}

ここで、独自の例外を作成しました。ここでは、SqlException をキャプチャする@lastuptime代わりにスカラー変数を指定しています。@lastupdatetime

これが私の DatabaseException クラスです。

class DataBaseException : Exception
{
    public DataBaseException(string Message)
        : base(Message)
    {

    }
    public DataBaseException(string message, Exception innerException)
        : base(message, innerException)
    {
    }
}

ここで、プログラムの実行中にエラーが表示されます

 sqlCommand.ExecuteQuery();

ただし、エラーをキャプチャせず、メッセージ ボックスのテキストを表示しません。私は何か間違ったことをしたことを知っています。カスタム例外処理を作成したのが正しいか間違っているかわかりません。

誰でも私を助けることができますか?前もって感謝します。

4

5 に答える 5

2

呼び出し元のメソッドでキャッチできるように、カスタム例外をスローする必要があります。コードでは、プログラムはカスタム例外ではなく、DB から例外をスローします。

void UpdateDatabase()
{
//...
        try 
            { 

            } 
               // Your checks to identify - type of exception
               // ...
              // .net exception
              // Throw your custom exception in the appropriate block - 
              // throw new DatabaseException();
            catch (OutOfMemoryException ex1) 
            { 

            }
            catch (InvalidDataException ex2) 
            { 

            }
            // Generic exception
            catch (Exception ex3) 
            { 
                // throw new DatabaseException();
            } 
//....
}

// Method calling UpdateDatabase need to handle Custom exception
void CallUpdateDatabase()
{
 try
  {
    UpdateDatabase();
  }
  catch(DatabaseException dbEx)
  {
    // Handle your custom exception
  }
}
于 2011-09-16T05:35:41.973 に答える
0

SqlCommandのプロパティとメソッドは、作成したDatabaseExceptionをスローしません。したがって、キャッチがトリガーされることはありません。

Exception DatabaseExceptionを作成して呼び出したという事実は、すべての「データベース」コードが例外をスローすることを意味するわけではありません。SqlCommandが作成されたとき、非常に特定の例外セットをスローするように作成されました。SqlCommandとそのメソッドがスローする例外のリストは、MSDNにあります。

私の答えがあなたに意味をなさない場合は私に知らせてください。

于 2011-09-16T05:40:32.780 に答える
0

これは私がこのルーチンを書く方法です(多かれ少なかれ)。必ずDB接続を閉じ、using構文を使用してsqlCommandobjを解放してください。

 try
    {
        string insertData = string.Format("INSERT INTO " + constants.PIZZABROADCASTTABLE + " VALUES(@starttime,@endtime,@lastupdatetime,@applicationname)");
        using (sqlCommand = new SqlCommand(insertData, databaseConnectivity.connection))
        {
            sqlCommand.Parameters.AddWithValue("@starttime", broadcastStartDateTime);
            sqlCommand.Parameters.AddWithValue("@endtime", broadcastEndDateTime);
            sqlCommand.Parameters.AddWithValue("@lastuptime", currentDateTime);
            sqlCommand.Parameters.AddWithValue("@applicationname", txtApplicationName.Text);

            sqlCommand.ExecuteNonQuery();
        }
    }
    catch (Exception ex)
    {
        string s = "Failed to insert into table " + constants.PIZZABROADCASTTABLE + "Database Error! " + Environment.NewLine + "Details: " + ex.ToString();
        MessageBox.Show(s, MessageBoxButtons.OK, MessageBoxIcons.Error);
        // Or
        //throw new DatabaseException(s, ex);
    }
    finally
    {
        if (databaseConnectivity != null && databaseConnectivity.connection != null) 
            databaseConnectivity.connection.Close();
        else
            MessageBox.Show("No database connectivity!", "Error", MessageBoxButtons.OK, MessageBoxIcons.Error); 
    }
于 2011-09-16T06:18:39.767 に答える
0

Throw Class の詳細については、こちらを参照してください。

http://msdn.microsoft.com/en-us/library/system.activities.statements.throw.aspx

よろしく。

于 2011-09-16T06:26:23.760 に答える
0

あなた自身の例外は問題ありませんが、Sql.ExecuteQuery は SqlException をスローします。次のようなことができます。

void CallDatabase( /* your parameters */)
{
    try
    {
        string insertData = string.Format("INSERT INTO " + constants.PIZZABROADCASTTABLE + " VALUES(@starttime,@endtime,@lastupdatetime,@applicationname)");
        sqlCommand = new SqlCommand(insertData, databaseConnectivity.connection);
        sqlCommand.Parameters.AddWithValue("@starttime", broadcastStartDateTime);
        sqlCommand.Parameters.AddWithValue("@endtime", broadcastEndDateTime);
        sqlCommand.Parameters.AddWithValue("@lastuptime", currentDateTime);
        sqlCommand.Parameters.AddWithValue("@applicationname", txtApplicationName.Text);
        sqlCommand.ExecuteNonQuery();

    }
    catch (SqlException ex)
    {
        throw new DataBaseException("Database error", ex);
    }
}

/* somewhere in your code */
try
{
   CallDatabase(...);
}
catch (DataBaseException ex)
{
    MessageBox.Show(ex.Message);
}
于 2011-09-16T05:41:44.823 に答える