1

文字列を含む必要があるデータブルを返したいのですが、データブルを返すときに手動で文字列を追加します。使用しているコードは次のとおりです。

static public DataTable GetInfoByCode(string code, string user)
    {

    string sql =    "SELECT aspnet_Users.UserName,  " +
                    "Code.dateUsed" +
                    "FROM aspnet_Membership INNER JOIN" +
                    "aspnet_Users ON aspnet_Membership.UserId = aspnet_Users.UserId INNER JOIN"+
                    "rAccessCode ON aspnet_Users.UserId = rAccessCode.userID INNER JOIN"+
                    "Code ON rAccessCode.CodeID = Code.accessCodeID"+
                    "WHERE (Code.accessCode = code)";

                    MembershipUser userPass = Membership.GetUser(user);
                    string password = userPass.GetPassword();
                    SqlDataAdapter da = new SqlDataAdapter(sql, ConnectionString);
        DataTable dt = new DataTable();
        da.Fill(dt);
        return dt; //want to return password field in the dt so that i can link datasource with datagridview and show password and username in gridview
        }

次のようにデータグリッドビューでパスワードフィールドを取得できるように、dtにパスワードを追加したいと思います。

<asp:GridView ID="gvList" runat="server" >
    <Columns>
        <asp:BoundField DataField="UserName" ReadOnly="True" HeaderText="Username" />
        <asp:BoundField DataField="password" ReadOnly="True" HeaderText="Password" />
    </Columns>
</asp:GridView>
4

3 に答える 3

2

データ テーブルに 1 行だけが返されることを期待している場合は、次の修正を行うことができます。

DataTable dt = new DataTable();
da.Fill(dt);
//Add the password column:
dt.Columns.Add("password", typeof (String)); 
//set the value:
dt.Rows[0]["password"] = password;
//Now return your datatable

これにより、呼び出された DataTable に追加の列が追加passwordされ、値が設定されます。

ただし、元の例では、ユーザー名でフィルタリングしている場所がわかりません。ここでは、次のようなクエリが役立ちます。

string sql =    "SELECT aspnet_Users.UserName,  " +
                "Code.dateUsed " +
                "FROM aspnet_Membership INNER JOIN" +
                "aspnet_Users ON aspnet_Membership.UserId = aspnet_Users.UserId INNER JOIN"+
                "rAccessCode ON aspnet_Users.UserId = rAccessCode.userID INNER JOIN"+
                "Code ON rAccessCode.CodeID = Code.accessCodeID"+
                "WHERE (Code.accessCode = @code)";


                using(SqlConnection connection = new SqlConnection("connstring"))
                {
                    using(SqlCommand command = new SqlCommand())
                    {
                        command.Connection = connection;
                        command.CommandType = CommandType.Text;
                        command.Text = sql;

                        command.Parameters.AddWithValue("@code", code);

                        connection.Open();

                        using(SqlDataReader reader = command.ExecuteReader())
                        {
                            dt.Load(reader);
                        }

                    }


                } 

ユーザーのコードに一致する行のみを返そうとするように、クエリがパラメータ化されていることに注意してください。そのような行が存在しない場合は、これに対応する必要があります (dt.Rows.Count == 0たとえば)

ただし、他のポスターに同意します。これをカスタム ユーザー オブジェクトとして表現してはならない理由はありません。これをディスプレイにデータ バインドすることはできます。例えば:

public class User{

  public string UserName { get; set; }

  public string Code { get; set; }

  public string PasswordHash { get; set; }


  public User()
  {

  }


} 

そして、ロード中に:

User user = new User();     

using(...)
{
        using(SqlDataReader reader = command.ExecuteReader())
        {
            if(reader.Read())
            {   
                user.UserName = reader.GetString(reader.GetOrdinal("UserName"));
            }     
        }
    }

user.PasswordHash = userPass.GetPassword();
user.Code = code;

using(...) は外側の using ブロックの省略形です。

これができない理由もありませList<User>ん。

于 2012-07-19T11:46:19.007 に答える
1

単一のレコードが常に返される場合は、次のことができます

dt.Columns.Add("Password");
dt.Rows[0]["Password"] = password;

それ以外の場合は、レコードをループしてパスワードを割り当てる必要があります

于 2012-07-19T11:48:42.240 に答える
1

必要なすべての値を保持するオブジェクトを返し、データグリッドをそのようなオブジェクトのリストにバインドすることをお勧めします。ただし、DataTable ソリューションに固執する場合は、列を追加して (または、以下の例のように選択するように追加して)、パスワード データを入力できます。ところで。このクエリは、1 行だけで DataTable を返すようです。

static public DataTable GetInfoByCode(string code, string user) {

string sql =    "SELECT aspnet_Users.UserName,  " +
                "Code.dateUsed, Password as '' " +
                "FROM aspnet_Membership INNER JOIN" +
                "aspnet_Users ON aspnet_Membership.UserId = aspnet_Users.UserId INNER JOIN"+
                "rAccessCode ON aspnet_Users.UserId = rAccessCode.userID INNER JOIN"+
                "Code ON rAccessCode.CodeID = Code.accessCodeID"+
                "WHERE (Code.accessCode = code)";

                MembershipUser userPass = Membership.GetUser(user);
                string password = userPass.GetPassword();
                SqlDataAdapter da = new SqlDataAdapter(sql, ConnectionString);
    DataTable dt = new DataTable();
    da.Fill(dt);
    if (dt.Rows.Count > 0)
      dt.Rows[0].SetField<string>("Password", password);
    return dt; //want to return password field in the dt so that i can link datasource with datagridview and show password and username in gridview
    }
于 2012-07-19T11:47:08.890 に答える