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 中添加密码,以便在 datagrid 视图中检索密码字段,例如:

<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

如果您希望数据表中有一个且只有一行,则可以进行以下修改:

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

最好返回将包含所有想要的值的对象,然后将数据网格绑定到此类对象的列表。但是,如果您想坚持使用 DataTable 解决方案,您可以添加列(或在下面的示例中添加它以选择)并用密码数据填充它。顺便提一句。似乎此查询将返回只有一行的 DataTable:

静态公共数据表GetInfoByCode(字符串代码,字符串用户){

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 回答
1

如果总是返回一条记录,那么你可以这样做

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

否则您将不得不遍历您的记录并分配密码

于 2012-07-19T11:48:42.240 回答