Is it ok to use goto in catch? start:
try
{
    oleDbDataAdapter1.Fill(myDataTable);
}
catch (Exception ex) {
    DialogResult res = MessageBox.Show("Can't load data:\n" + ex.Message, "Error",
        MessageBoxButtons.RetryCancel, MessageBoxIcon.Error);
    if (res == DialogResult.Retry)
    {
        goto start;
    }
}



Is it ok to use goto operators, which lead outside a try/catch block?  What consequences may it lead to?
How can I make this code better?
I'm personally not a fan of goto's and to be honest I don't even know if I've ever used on in c#.  I tend to find they are a bit hard to follow as you have to jump around a bit too much and the natural flow of the code is potentially broken.  

Here's an idea for using a different approach (Updated as suggested by svick)

string errorMessage;
while(!TryTableFill(myDataTable, out errorMessage))
{
    DialogResult result = MessageBox.Show("Can't load data:\n" + errorMessage, "Error", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error);

    if(result != DialogResult.Retry)
        break;
}

private boolean TryTableFill(myDataTable, out string errorMessage)
{
    errorMessage = string.Empty;

    try
    {
       oleDbDataAdapter1.Fill(myDataTable);
       return true;   
    }
    catch (Exception ex) {  
       errorMessage = ex.Message;
       return false;
    }       
}


or alternatively (I like this way but I'm not sure if it's better.  Added just to provide an alternative):

private boolean TryTableFill(myDataTable, out string errorMessage)
{
    errorMessage = string.Empty;

    try
    {
       oleDbDataAdapter1.Fill(myDataTable);
    }
    catch (Exception ex) {  
       errorMessage = string.Format("Error occured: {0}", ex.Message);
    }       

    return !string.isNullOrEmpty(errorMessage);
}