When I posted the notes yesterday from Zain's presentation, I posted something about adding users in code ... but I only mentioned the CreateUser() method. Well, I just got an email from the person that requested this little tip ... with a little curve thrown in. They also needed to add some profile information. So, I sat down and wrote a little sample of how to do this (liberally sprinkled with comments). For those that attended my peformance session in Second Life, there's another little perf tip in here that I forgot to put into my presentation (it's going in now though).
Here it is ...
//Some assumptions ...
//You have all the user information in a data reader
//It actually doesn't matter where it comes from
//but using a reader makes the sample easier. :)
//The using statements that are important here:
//using System.Web.Security;
//using System.Web.Profile;
public static void AddUsers(SqlDataReader rdr)
{
//Set the script timeout to 10 minutes ...
//Use a reasonable value
HttpContext.Current.Server.ScriptTimeout = 60000;
//And we will get the indexes for the fields that we want
//This is a good deal more efficient than rdr["FieldName"]
//but ... you *must* do it before entering the loop.
//It's also type safe as well. :-)
int userId = rdr.GetOrdinal("UserID");
int password = rdr.GetOrdinal("Password");
int email = rdr.GetOrdinal("Reader");
int favColor = rdr.GetOrdinal("FavoriteColor");
int height = rdr.GetOrdinal("Height");
int street = rdr.GetOrdinal("Street");
while (rdr.Read())
{
//Add the users ...
//I'm using one of the overloads here ... there are several.
//This returns the membership user that was created;
MembershipUser usr = Membership.CreateUser(rdr.GetString(userId),
rdr.GetString(password), rdr.GetString(email));
//Now you will need to create the profile.
ProfileBase prof = System.Web.Profile.ProfileBase.Create(usr.UserName);
//And I'm making up some properties here.
//These will need to be configured.
prof.PropertyValues["FavoriteColor"].PropertyValue = rdr.GetString(favColor);
prof.PropertyValues["Height"].PropertyValue = rdr.GetString(height);
//And, if you're using groups
//(A good idea if you have a lot of properties)
ProfileGroupBase addrGroup = prof.GetProfileGroup("Address");
addrGroup.SetPropertyValue("Street", rdr.GetString(street));
//Make sure that the profile is saved
prof.Save();
}
}
And ... that's all folks!