I prefer to go with the following. You use 'using' for the objects which implement the IDisposable interface. That ensures, that after their use, and on error, their ressources are released. I do not know the Database object, but if it also implements IDisposable, then use 'using', otherwise just use the surrounding try-catch, and perform cleanup tasks in the finally.
I usually chose to create the return variable on top of a method with their default value, and return it at the end. So you always get the actual state of the variable at the end.
public DataTable BindRole()
{
DataTable dataTable = new DataTable();
try
{
Database _database = DatabaseFactory.CreateDatabase();
using (DbCommand dbCommand = _database.GetSqlStringCommand(QMROLE.FetchData))
{
using (DataSet _ds = _database.ExecuteDataSet(dbCommand))
{
dataTable = _ds.Tables[0];
}
}
}
catch
{
}
finally
{
// perform cleanup
}
return dataTable;
}