【问题标题】:Returning datatable and a string返回数据表和字符串
【发布时间】:2012-07-19 11:33:16
【问题描述】:

我想返回一个应该包含一个字符串的数据表,在返回一个数据表时手动添加一个字符串,下面是我正在使用的代码:

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>

【问题讨论】:

  • 密码是散列还是明文?
  • 您无法以明文形式显示散列密码,那么您想显示什么?

标签: asp.net gridview datatable


【解决方案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&lt;User&gt;

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 2019-08-05
        • 2017-04-17
        • 1970-01-01
        • 2018-06-07
        • 1970-01-01
        相关资源
        最近更新 更多