A lengthy post with full description is a good post imho 
So, about your issue at hand, use OldValuesParameterFormatString Property of your objectdatasource control like this :
<asp:ObjectDataSource ID="objAllDepartments" runat="server" TypeName="Project.BLL.Membership.Role"
SelectMethod="GetAllRoles" UpdateMethod="UpdateRole" DeleteMethod="DeleteRole" OnDeleted="DepartmentDeleted"
OldValuesParameterFormatString="{0}_original" ConflictDetection="CompareAllValues">
<UpdateParameters>
<asp:Parameter Name="roleName_original" Type="String" />
<asp:Parameter Name="roleName" Type="String" />
</UpdateParameters>
<DeleteParameters>
<asp:Parameter Name="RoleName" />
</DeleteParameters>
</asp:ObjectDataSource>
in this way, since the value you need (the original rolename unmodified is still stored in datakeynames) and the new value will both have the same name, you can resolve the conflict and get both the parameters by applying OldValuesParameterFormatString="{0}_original" and ConflictDetection="CompareAllValues".
note the value of OldValuesParameterFormatString="{0}_original" ; this will pass your fieldname from datakeynames unchanged as it was, renamed as fieldName_original as this is the format i chose to use {0}_original ;
now make the change also in your function for clarity :
public static void UpdateRole(string RoleName_original, string RoleName){...}
and it should just work*
msdn:
Conflict Detection
By setting the ObjectDataSource control's ConflictDetection property to true, you can specify that the ObjectDataSource control should include original values when calling update methods of the source data object.
http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.objectdatasource.oldvaluesparameterformatstring.aspx
http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.objectdatasource.conflictdetection.aspx
Not much information provided on msdn i'm afraid, but that and the answer in this post will help you put 2+2 together 