用GridView列出Profile存储的用户信息如公司名称等!

相信很多人用Profile存储用户信息如公司名称等,但是在后台想用列表的方式列出来,却是很难,试试我的方法吧。


1. 在数据库里建一视图:view_Profile
SELECT dbo.aspnet_Users.ApplicationId, dbo.aspnet_Users.UserName,
      dbo.aspnet_Profile.PropertyNames, dbo.aspnet_Profile.PropertyValuesString,
      dbo.aspnet_Profile.PropertyValuesBinary
FROM dbo.aspnet_Profile INNER JOIN
      dbo.aspnet_Users ON dbo.aspnet_Profile.UserId = dbo.aspnet_Users.UserId


2.在数据库里建一存储过程:proc_Profile_GetProfiles
CREATE PROCEDURE dbo.proc_Profile_GetProfiles
    @ApplicationName      nvarchar(256)
AS
BEGIN
    DECLARE @ApplicationId uniqueidentifier
    SELECT  @ApplicationId = NULL
    SELECT  @ApplicationId = ApplicationId FROM dbo.aspnet_Applications WHERE LOWER(@ApplicationName) = LoweredApplicationName
    IF (@ApplicationId IS NULL)
        RETURN


    SELECT UserName, PropertyNames, PropertyValuesString, PropertyValuesBinary
    FROM         dbo.view_Profile
    WHERE ApplicationId = @ApplicationId

END

 

3. 建一个新类:QwpUserController
    public class QwpUserController
    {
        public static List<ProfileBase> GetUsers()
        {
            Type type = HttpContext.Current.Profile.GetType();
            Database db = DatabaseFactory.CreateDatabase();
            DbCommand dbCommand = db.GetStoredProcCommand("proc_Profile_GetProfiles");
            db.AddInParameter(dbCommand, "ApplicationName", DbType.String, ProfileManager.Provider.ApplicationName);
            SqlDataReader reader1 = (SqlDataReader)db.ExecuteReader(dbCommand);

            List<ProfileBase> list = null;
            if(reader1.HasRows)
                list = new List<ProfileBase>();

            while (reader1.Read())
            {
                string userName = null;
                string[] textArray1 = null;
                string text1 = null;
                byte[] buffer1 = null;

                userName = reader1.GetString(0);
                textArray1 = reader1.GetString(1).Split(new char[] { ':' });
                text1 = reader1.GetString(2);
                int num1 = (int)reader1.GetBytes(3, (long)0, null, 0, 0);
                buffer1 = new byte[num1];
                reader1.GetBytes(3, (long)0, buffer1, 0, num1);

                ProfileBase profile = (ProfileBase)type.GetConstructor(new Type[0]).Invoke(new object[0]);

                profile.Initialize(userName, true);


                ParseDataFromDB(textArray1, text1, buffer1, profile.PropertyValues);

                list.Add(profile);

            }

            return list;
        }

        static void ParseDataFromDB(string[] names, string values, byte[] buf, SettingsPropertyValueCollection properties)
        {
            if (((names != null) && (values != null)) && ((buf != null) && (properties != null)))
            {
                try
                {
                    for (int num1 = 0; num1 < (names.Length / 4); num1++)
                    {
                        string text1 = names[num1 * 4];
                        SettingsPropertyValue value1 = properties[text1];
                        if (value1 != null)
                        {
                            int num2 = int.Parse(names[(num1 * 4) + 2], CultureInfo.InvariantCulture);
                            int num3 = int.Parse(names[(num1 * 4) + 3], CultureInfo.InvariantCulture);
                            if ((num3 == -1) && !value1.Property.PropertyType.IsValueType)
                            {
                                value1.PropertyValue = null;
                                value1.IsDirty = false;
                                value1.Deserialized = true;
                            }
                            if (((names[(num1 * 4) + 1] == "S") && (num2 >= 0)) && ((num3 > 0) && (values.Length >= (num2 + num3))))
                            {
                                value1.SerializedValue = values.Substring(num2, num3);
                            }
                            if (((names[(num1 * 4) + 1] == "B") && (num2 >= 0)) && ((num3 > 0) && (buf.Length >= (num2 + num3))))
                            {
                                byte[] buffer1 = new byte[num3];
                                Buffer.BlockCopy(buf, num2, buffer1, 0, num3);
                                value1.SerializedValue = buffer1;
                            }
                        }
                    }
                }
                catch
                {
                }
            }
        }

    }

 

4. 使用这个类返回List<ProfileBase>

马有了。

posted @ 2006-04-07 11:57  海潮的博客  阅读(984)  评论(5编辑  收藏  举报