none
ユーザ情報の編集 RRS feed

  • 質問

  • 現在、SQLでユーザ情報を管理しているのですが

    UserIDを元に別テーブルに保存しているデータを修正する方法がわかりません。

    FormViewを使用して変更したいのですがヒントがありましたら教えていただけないでしょうか。

    2007年4月29日 10:02

回答

  • > 新規ユーザを作成する際にUserIdを元にprofile情報を別テーブルに保存しています。
     
    この部分をもう少し詳しく。
     
    ASP.NET の Profile 機能を使用して、SqlProfileProvider などの更新可能なシステムに連結しているのであれば、FormView を利用せず、通常の ASP.NET コントロールを利用するのが手軽だと思います。たとえば Nickname という文字列型の値であれば、
     
    <asp:TextBox ID="TextBox1" Text="<%= Profile.Nickname %>" />
     
    のような感じでテキストボックスを配置しておいて、ポストバック処理で、
     
    [code]
    // Nickname を更新
    Profile.Nickname = TextBox1.Text;
     
    // 変更を保存
    Profile.Save()
    [/code]
     
    とすれば良いだけです。
     
    ASP.NET の Profile 機能を利用せず、独自のテーブルで管理されているデータであれば、SQLDataSource を配置して、Profile パラメータを利用すればログイン中の UserID をキーにした SQL を簡単に組み立てられると思います。
     
    2007年4月30日 4:36
  • User.Identity.NameはWindows認証のユーザー名が入ってきていると思います。単に、Membership.GetUser(); で、いいんじゃないでしょうか?
    2007年4月30日 17:21
    モデレータ
  • FormViewをツールボックスからドラッグアンドドロップし、そのDataSourceIDにSqlDataSourceを指定するだけで、表示および更新などができるようになります。Bindは双方向バインドですので、表示および入力が可能です。Evalは表示のみです。
    FormViewを利用した場合には、自動的にSqlDataSourceIDに指定したデータソースがバインドされます。以下、私がテストしたコードを参考までに掲載します。ログイン成功後に表示されるページのコードです。

    Code Snippet

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="LoggedInPage.aspx.cs" Inherits="LoggedInPage" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>無題のページ</title>
    </head>
    <body>
        <form id="form1" runat="server">
       <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:aspnetdbConnectionString %>"
                SelectCommand="SELECT [UserID], [information] FROM [UserInformation] WHERE ([UserID] = @UserID)" DeleteCommand="DELETE FROM [UserInformation] WHERE [UserID] = @UserID" InsertCommand="INSERT INTO [UserInformation] ([UserID], [information]) VALUES (@UserID, @information)" UpdateCommand="UPDATE [UserInformation] SET [information] = @information WHERE [UserID] = @UserID">
           <DeleteParameters>
               <asp:Parameter Name="UserID" Type="Object" />
           </DeleteParameters>
           <UpdateParameters>
               <asp:Parameter Name="information" Type="String" />
               <asp:Parameter Name="UserID" Type="Object" />
           </UpdateParameters>
           <InsertParameters>
               <asp:Parameter Name="UserID" Type="Object" />
               <asp:Parameter Name="information" Type="String" />
           </InsertParameters>
           <SelectParameters>
               <asp:Parameter Name="UserID" Type="String" />
           </SelectParameters>
            </asp:SqlDataSource>        &nbsp;
            <asp:FormView ID="FormView1" runat="server" DataKeyNames="UserID" DataSourceID="SqlDataSource1">
                <EditItemTemplate>
                    UserID:
                    <asp:Label ID="UserIDLabel1" runat="server" Text='<%# Eval("UserID") %>'></asp:Label><br />
                    information:
                    <asp:TextBox ID="informationTextBox" runat="server" Text='<%# Bind("information") %>'>
                    </asp:TextBox><br />
                    <asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True" CommandName="Update"
                        Text="更新">
                    </asp:LinkButton>
                    <asp:LinkButton ID="UpdateCancelButton" runat="server" CausesValidation="False" CommandName="Cancel"
                        Text="キャンセル">
                    </asp:LinkButton>
                </EditItemTemplate>
                <InsertItemTemplate>
                    UserID:
                    <asp:TextBox ID="UserIDTextBox" runat="server" Text='<%# Bind("UserID") %>'>
                    </asp:TextBox><br />
                    information:
                    <asp:TextBox ID="informationTextBox" runat="server" Text='<%# Bind("information") %>'>
                    </asp:TextBox><br />
                    <asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True" CommandName="Insert"
                        Text="挿入">
                    </asp:LinkButton>
                    <asp:LinkButton ID="InsertCancelButton" runat="server" CausesValidation="False" CommandName="Cancel"
                        Text="キャンセル">
                    </asp:LinkButton>
                </InsertItemTemplate>
                <ItemTemplate>
                    UserID:
                    <asp:Label ID="UserIDLabel" runat="server" Text='<%# Eval("UserID") %>'></asp:Label><br />
                    information:
                    <asp:Label ID="informationLabel" runat="server" Text='<%# Bind("information") %>'>
                    </asp:Label><br />
                    <asp:LinkButton ID="EditButton" runat="server" CausesValidation="False" CommandName="Edit"
                        Text="編集">
                    </asp:LinkButton>
                    <asp:LinkButton ID="DeleteButton" runat="server" CausesValidation="False" CommandName="Delete"
                        Text="削除">
                    </asp:LinkButton>
                    <asp:LinkButton ID="NewButton" runat="server" CausesValidation="False" CommandName="New"
                        Text="新規作成">
                    </asp:LinkButton>
                </ItemTemplate>
            </asp:FormView>
        </form>
    </body>
    </html>

     

    public partial class LoggedInPage : System.Web.UI.Page

    {

        protected void Page_Load(object sender, EventArgs e)

        {

            MembershipUser user = Membership.GetUser();

            Object UserGUID = user.ProviderUserKey;

     

            this.SqlDataSource1.SelectParameters["UserId"].DefaultValue = UserGUID.ToString();

        }

    }

     

    #5/3 14:18 修正しました。
     

    2007年5月3日 4:57
    モデレータ

すべての返信

  • 質問の内容がはっきりわからないので、もう少し具体的に書いていただけないでしょうか?
    FormViewにテーブルのデータが表示されており、何かのタイミングで、それとは別のテーブルを、UserIDをキーとして更新したいということでしょうか?
    2007年4月29日 15:13
    モデレータ
  • 返信ありがとうございます。

     

    CreateUserWizardで、新規ユーザを作成する際にUserIdを元にprofile情報を別テーブルに保存しています。

    ログイン後にその情報を編集したいのですが、いまいち方法が分かっていません。

    調べた限りだとFormViewを使用すると更新が楽なのかと思って調べているのですが使用方法が分りません。

    ログイン後にログインしたユーザの情報を表示する方法を探してます。

    よろしくお願いいたします。

    2007年4月30日 3:01
  • こちら参考になりますでしょうか?

     

    http://weblogs.asp.net/scottgu/archive/2005/10/18/427754.aspx

    2007年4月30日 3:24
  • > 新規ユーザを作成する際にUserIdを元にprofile情報を別テーブルに保存しています。
     
    この部分をもう少し詳しく。
     
    ASP.NET の Profile 機能を使用して、SqlProfileProvider などの更新可能なシステムに連結しているのであれば、FormView を利用せず、通常の ASP.NET コントロールを利用するのが手軽だと思います。たとえば Nickname という文字列型の値であれば、
     
    <asp:TextBox ID="TextBox1" Text="<%= Profile.Nickname %>" />
     
    のような感じでテキストボックスを配置しておいて、ポストバック処理で、
     
    [code]
    // Nickname を更新
    Profile.Nickname = TextBox1.Text;
     
    // 変更を保存
    Profile.Save()
    [/code]
     
    とすれば良いだけです。
     
    ASP.NET の Profile 機能を利用せず、独自のテーブルで管理されているデータであれば、SQLDataSource を配置して、Profile パラメータを利用すればログイン中の UserID をキーにした SQL を簡単に組み立てられると思います。
     
    2007年4月30日 4:36
  • 返信ありがとうございます。

     

    http://japan.internet.com/developer/20060829/26.html

     

    上記のURLを参考にユーザ情報を保存できたのですが

    ログイン後に編集する方法が分りませんでした。

    profileを使用して、編集する方法は分かったのですが

    上記の方法での編集方法が分りません。

    2007年4月30日 4:54
  • 悪戦苦闘して、以下のコードまでいったのですがデータが表示されません。
    何がうまくいかないのか分りません。
    もしよろしければ、ご教授いただけないでしょうか。
    <asp:SqlDataSource ID="SQLDataSource1" runat="server"
                 ConnectionString="<%$ ConnectionStrings:AZElectronicsConnection %>"
                 SelectCommand="SELECT UserId, FirstName, LastName FROM aspnet_UserInformation WHERE [UserId] = @UserId"
                 UpdateCommand="UPDATE [aspnet_UserInformation] SET [FirstName] = @FirstName, [LastName] WHERE [UserId] = @UserId"> 
    
      
                 <SelectParameters>
                    <asp:Parameter Name="UserID" />
                 </SelectParameters> 
     protected void Page_Load(object sender, EventArgs e)
     {
            MembershipUser user = Membership.GetUser(User.Identity.Name);
            Object UserGUID = user.ProviderUserKey;
            SQLDataSource1.SelectParameters.Add("UserId", UserGUID.ToString());
    }

     

    2007年4月30日 13:25
  • User.Identity.NameはWindows認証のユーザー名が入ってきていると思います。単に、Membership.GetUser(); で、いいんじゃないでしょうか?
    2007年4月30日 17:21
    モデレータ
  • 返信ありがとうございます。
    以下の内容に変更したのですが
    データの表示ができませんでした。
    何が悪いのか教えていただけないでしょうか。
     
    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("FirstName") %>'></asp:TextBox>
    <asp:SqlDataSource ID="SQLDataSource1" runat="server"
                 ConnectionString="<%$ ConnectionStrings:AZElectronicsConnection %>"
                 SelectCommand="SELECT UserId, FirstName, LastName FROM aspnet_UserInformation WHERE [UserId] = @UserId"
                 UpdateCommand="UPDATE [aspnet_UserInformation] SET [FirstName] = @FirstName, [LastName] WHERE [UserId] = @UserId"> 
    
      
                 <SelectParameters>
                    <asp:Parameter Name="UserID" Type="Object" />
                 </SelectParameters> 
     protected void Page_Load(object sender, EventArgs e)
     {
            MembershipUser user = Membership.GetUser();
            Object UserGUID = user.ProviderUserKey;
            SQLDataSource1.SelectParameters.Add("UserId", UserGUID.ToString());
    }
    2007年5月1日 5:20
  • データの表示ができないということですが、何かエラーメッセージが出ていませんか? できるだけ多くの情報があると、みなさんが回答しやすくなります。

    2007年5月1日 6:20
    モデレータ
  • 返信ありがとうございます。

    エラーは表示されません。

    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("FirstName") %>'></asp:TextBox>

    に値が表示されません。

     

    userdb.SelectParameters.Add("UserId", UserGUID.ToString());

    以外に

    userdb.Select()が必要なのかと思い試行錯誤してます。

    データベース関連は初めてするのでご迷惑をおかけしますが

    よろしくお願いいたします。

    2007年5月1日 6:56
  • 全体像がわからないのですが、とりあえず、以下のような感じで実行してみて下さい。

    TextBox1.Text = ((DataView)this.SqlDataSource1.Select(DataSourceSelectArguments.Empty)).Table.Rows[0][1].ToString();

    2007年5月1日 10:27
    モデレータ
  • 返信ありがとうございます。

     

    >全体像がわからないのですが

    既存のprofileを使用せずに

    独自にユーザ情報を格納するため、新規のデータベース(userdb)を作成して格納しています。

    ※CreateUserWizardで格納しています。格納する際にUserIdを主キーとして保存してます。

     

    で、ログイン後にユーザ情報を編集する機能を作成しているのですが

    ログインしたユーザのユーザ情報を表示する方法を探しています。

     

    UserIdを元にSelectCommandで取得できると思ったのですが、うまくいかず

    ネットで探しているのですが、Profileを取る方法は分かったのですが

    自分がしている方法での取得方法が分りません。

    #諦めて、Profileで格納しようかと思っていますが

     情報が結構大きいので、なるべくなら分けたいです。

     

    >TextBox1.Text = ((DataView)this.SqlDataSource1.Select(DataSourceSelectArguments.Empty)).Table.Rows[0][1].ToString();

     試したのですが、例外が発生しています。

     少し調べてみます。

    2007年5月1日 11:23
  •  you_tiro さんからの引用

    既存のprofileを使用せずに

    独自にユーザ情報を格納するため、新規のデータベース(userdb)を作成して格納しています。

    ※CreateUserWizardで格納しています。格納する際にUserIdを主キーとして保存してます。

     

    で、ログイン後にユーザ情報を編集する機能を作成しているのですが

    ログインしたユーザのユーザ情報を表示する方法を探しています。


    テストしてみました。こちらでは無事に別テーブルに保存したユーザー情報を表示できています。基本的にyou_tiroさんと同じように組んでみたつもりです。
    ここで一つ訂正があります。webサイト管理ツールで、「ユーザーがサイトにアクセスする方法」で「インターネットから」を選択している場合、Membership.GetUser()でも、Membership.GetUser(User.Identity.Name)でも、正しいユーザーが取得できました。すみません。m(_ _)m
    2007年5月1日 15:37
    モデレータ
  • 返信ありがとうございます。

     

    >テストしてみました。こちらでは無事に別テーブルに保存したユーザー情報を表示できています。

    本当ですが、申し訳ないですがご教授いただけないでしょうか。

     

    Response.Write(UserGUID.ToString());

    で値の取得ができていることは確認しました。

     

    protected void Page_Load(object sender, EventArgs e)

    {

        ......

        userdb.SelectParameters.Add("@UserId", UserGUID.ToString());

    }

     

                <asp:SqlDataSource ID="userdb" runat="server" ConnectionString="<%$ ConnectionStrings:USERDBConnectionString %>"
                    SelectCommand="SELECT [Email], [FastName], [LastName] FROM [vw_aspnet_Users] WHERE ([UserId] = @UserId)">
                    <SelectParameters>
                        <asp:Parameter Name="UserId" />
                    </SelectParameters>
                </asp:SqlDataSource>

    で、値の取得ができていません。

     

    一点確認したいのですが、値は代入しなくてはいけないのでしょうか?

    以下の処理では、まずいでしょうか?

     

    <asp:TextBox ID="FastNameTextBox" runat="server" Text='<%# Bind("FastName") %>'></asp:TextBox>

    2007年5月2日 6:49
  •  you_tiro さんからの引用

                <aspqlDataSource ID="userdb" runat="server" ConnectionString="<%$ ConnectionStrings:USERDBConnectionString %>"
                    SelectCommand="SELECT [Email], [FastName], [LastName] FROM [vw_aspnet_Users] WHERE ([UserId] = @UserId)">
                    <SelectParameters>
                        <asparameter Name="UserId" />
                    </SelectParameters>
                </aspqlDataSource>

    で、値の取得ができていません。

     

    確認ですが、追加のユーザー情報を保存するテーブルは、そのプロジェクトのApp_DataフォルダにあるASPNETDB.MDF(ASPNETDB.MDFはデフォルトの名前なので、違う名前かもしれません)に追加されたんでしょうか? そうであれば、その中にあるテーブルにきちんとデータが保存されていることが確認できますでしょうか?

     

     you_tiro さんからの引用

    一点確認したいのですが、値は代入しなくてはいけないのでしょうか?

    以下の処理では、まずいでしょうか?

     

    <asp:TextBox ID="FastNameTextBox" runat="server" Text='<%# Bind("FastName") %>'></asp:TextBox>

    これだけではバインドされません。TextBoxをFormViewなどのデータソースコントロールでラップして下さい。(TextBoxをFormViewの中などに置く必要があります) EvalやBindはデータソースコントロールで使用します。データソースコントロールに関しては、以下を参考にして下さい。

    ASP.NET データ アクセスの概要 
    http://msdn2.microsoft.com/ja-jp/library/ms178359(VS.80).aspx


    しかし、TextBoxに値を表示したいだけであれば、そのTextプロパティに値を代入した方が良いでしょう。

    2007年5月2日 7:52
    モデレータ
  • 返信ありがとございます。

     

    出来ました。

    userdb.SelectParameters["UserId"].DefaultValue = UserGUID.ToString();
     で、値が表示されました。

    これで問題ないでしょうか?

     

    >そうであれば、その中にあるテーブルにきちんとデータが保存されていることが確認できますでしょうか?

    値は格納されております。

    2007年5月2日 12:57
  •  you_tiro さんからの引用

    userdb.SelectParameters["UserId"].DefaultValue = UserGUID.ToString();
     で、値が表示されました。

    これで問題ないでしょうか?


    はい、問題ありません。DefaultValueに対して、値を与えてあげます。
    2007年5月2日 13:40
    モデレータ
  • 表示は解決したのですが、Updateが分らないのでもう少しだけお付き合いいただけないでしょうか。

    以下の内容で更新を行おうとしてるのですがうまくいきません。

    FormViewでデータの表示は行っております。

     

        <aspTongue TiedqlDataSource ID="userdb" runat="server" ConnectionString="<%$ ConnectionStrings:USERDBConnectionString %>"
            SelectCommand="SELECT [FastName], [LastName] FROM [vw_aspnet_Users] WHERE ([UserId] = @UserId)"
            UpdateCommand="UPDATE [vw_aspnet_Users] SET [FastName] = @FastName, [LastName] = @LastName WHERE ([UserId] = @UserId)">
            <SelectParameters>
                <aspStick out tonguearameter Name="UserId" Type="String" />
            </SelectParameters>
            <UpdateParameters>
                <aspStick out tonguearameter Name="UserId" Type="String" />
                <aspStick out tonguearameter Name="FastName" Type="String" />
                <aspStick out tonguearameter Name="LastName" Type="String" />
            </UpdateParameters>

     protected void FormView_ItemUpdated(object sender, FormViewUpdatedEventArgs e)
       {

         userdb.UpdateParameters["UserId"].DefaultValue = UserGUID.ToString();

     }

    2007年5月2日 14:47
  • FormViewをツールボックスからドラッグアンドドロップし、そのDataSourceIDにSqlDataSourceを指定するだけで、表示および更新などができるようになります。Bindは双方向バインドですので、表示および入力が可能です。Evalは表示のみです。
    FormViewを利用した場合には、自動的にSqlDataSourceIDに指定したデータソースがバインドされます。以下、私がテストしたコードを参考までに掲載します。ログイン成功後に表示されるページのコードです。

    Code Snippet

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="LoggedInPage.aspx.cs" Inherits="LoggedInPage" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>無題のページ</title>
    </head>
    <body>
        <form id="form1" runat="server">
       <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:aspnetdbConnectionString %>"
                SelectCommand="SELECT [UserID], [information] FROM [UserInformation] WHERE ([UserID] = @UserID)" DeleteCommand="DELETE FROM [UserInformation] WHERE [UserID] = @UserID" InsertCommand="INSERT INTO [UserInformation] ([UserID], [information]) VALUES (@UserID, @information)" UpdateCommand="UPDATE [UserInformation] SET [information] = @information WHERE [UserID] = @UserID">
           <DeleteParameters>
               <asp:Parameter Name="UserID" Type="Object" />
           </DeleteParameters>
           <UpdateParameters>
               <asp:Parameter Name="information" Type="String" />
               <asp:Parameter Name="UserID" Type="Object" />
           </UpdateParameters>
           <InsertParameters>
               <asp:Parameter Name="UserID" Type="Object" />
               <asp:Parameter Name="information" Type="String" />
           </InsertParameters>
           <SelectParameters>
               <asp:Parameter Name="UserID" Type="String" />
           </SelectParameters>
            </asp:SqlDataSource>        &nbsp;
            <asp:FormView ID="FormView1" runat="server" DataKeyNames="UserID" DataSourceID="SqlDataSource1">
                <EditItemTemplate>
                    UserID:
                    <asp:Label ID="UserIDLabel1" runat="server" Text='<%# Eval("UserID") %>'></asp:Label><br />
                    information:
                    <asp:TextBox ID="informationTextBox" runat="server" Text='<%# Bind("information") %>'>
                    </asp:TextBox><br />
                    <asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True" CommandName="Update"
                        Text="更新">
                    </asp:LinkButton>
                    <asp:LinkButton ID="UpdateCancelButton" runat="server" CausesValidation="False" CommandName="Cancel"
                        Text="キャンセル">
                    </asp:LinkButton>
                </EditItemTemplate>
                <InsertItemTemplate>
                    UserID:
                    <asp:TextBox ID="UserIDTextBox" runat="server" Text='<%# Bind("UserID") %>'>
                    </asp:TextBox><br />
                    information:
                    <asp:TextBox ID="informationTextBox" runat="server" Text='<%# Bind("information") %>'>
                    </asp:TextBox><br />
                    <asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True" CommandName="Insert"
                        Text="挿入">
                    </asp:LinkButton>
                    <asp:LinkButton ID="InsertCancelButton" runat="server" CausesValidation="False" CommandName="Cancel"
                        Text="キャンセル">
                    </asp:LinkButton>
                </InsertItemTemplate>
                <ItemTemplate>
                    UserID:
                    <asp:Label ID="UserIDLabel" runat="server" Text='<%# Eval("UserID") %>'></asp:Label><br />
                    information:
                    <asp:Label ID="informationLabel" runat="server" Text='<%# Bind("information") %>'>
                    </asp:Label><br />
                    <asp:LinkButton ID="EditButton" runat="server" CausesValidation="False" CommandName="Edit"
                        Text="編集">
                    </asp:LinkButton>
                    <asp:LinkButton ID="DeleteButton" runat="server" CausesValidation="False" CommandName="Delete"
                        Text="削除">
                    </asp:LinkButton>
                    <asp:LinkButton ID="NewButton" runat="server" CausesValidation="False" CommandName="New"
                        Text="新規作成">
                    </asp:LinkButton>
                </ItemTemplate>
            </asp:FormView>
        </form>
    </body>
    </html>

     

    public partial class LoggedInPage : System.Web.UI.Page

    {

        protected void Page_Load(object sender, EventArgs e)

        {

            MembershipUser user = Membership.GetUser();

            Object UserGUID = user.ProviderUserKey;

     

            this.SqlDataSource1.SelectParameters["UserId"].DefaultValue = UserGUID.ToString();

        }

    }

     

    #5/3 14:18 修正しました。
     

    2007年5月3日 4:57
    モデレータ
  • trapemiyaさん、ありがとうございました。

    無事に解決しました。

    また、お世話になった時はよろしくお願いいたします。

    2007年5月4日 7:52