1

如何从我的用户行中提取列数据?EX:当客户端登录时,这会在我的 WCF 服务器上调用。它的工作原理是 var xx = ds.Tables[0].Rows[1]; 它在客户端引发错误。基本上我试图在数据库中验证用户/通行证。然后将订阅到期的日期时间返回给客户。

public bool Authenticate(string userId, string password, out string token)
    {
        token = "";

        string MyConnectionString = "Server=localhost;Database=testdb;Uid=root;Pwd=admin;";
        MySqlConnection sqlCon = new MySqlConnection(MyConnectionString);
        sqlCon.Open();

        MySqlCommand cmd = sqlCon.CreateCommand();
        cmd.CommandText = "SELECT * FROM table1 WHERE username = '"+userId+"' AND password = '"+password+"'";
        MySqlDataAdapter adap = new MySqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        adap.Fill(ds);


        if (ds.Tables[0].Rows.Count > 0)
        {
            token = Guid.NewGuid().ToString();
            var xx = ds.Tables[0].Rows[0];


            CustomDataSource.AddUserData(token, userId);

            return true;
        }

        return false;
    }
4

3 回答 3

2

好吧,我想您的查询仅返回一行(如果找到具有正确密码的用户)

在这种情况下,您从返回的第一行(索引零)中获取日期。
另外我假设您的日期存储在第五列(索引四)中,如果不是,您应该调整第二个索引以指向正确的列。(基本数组索引始终为零)

if (ds.Tables[0].Rows.Count > 0)
{
    token = Guid.NewGuid().ToString();
    var xx = ds.Tables[0].Rows[0][4];
    CustomDataSource.AddUserData(token, userId);
    return true;
}

说了这么多,让我指出这段代码的一个大问题。
这段代码可以很容易地用于Sql 注入攻击,因为它连接了可能由您的用户键入的字符串,以形成传递给数据库引擎的 Sql 文本。相反,您应该使用参数来避免 Sql 注入问题和引用用户文本(带撇号的密码?)

    using(MySqlConnection sqlCon = new MySqlConnection(MyConnectionString))
    {
        sqlCon.Open();
        MySqlCommand cmd = sqlCon.CreateCommand();
        cmd.CommandText = "SELECT * FROM table1 WHERE username = ?user AND password = ?pwd";
        cmd.Parameters.AddWithValue("?user", userId);
        cmd.Parameters.AddWithValue("?pwd", password);
        using(MySqlDataAdapter adap = new MySqlDataAdapter(cmd))
        {
            DataSet ds = new DataSet();
            adap.Fill(ds);
        }
    }
于 2012-11-08T23:46:40.700 回答
0

var xx = ds.Tables[0].Rows[0].ItemArray[5];

是如何。

于 2012-11-08T23:46:29.073 回答
0

尝试使用foreach循环

foreach (DataRow row in ds.Tables[0].Rows) 
{
    var xx = row[1];
    var x = row[5];

    // other codes

    return true;
}

另一件事,参数化您的查询以避免SQL injection

using(MySqlConnection sqlCon = new MySqlConnection(MyConnectionString))
{
    using (MySqlCommand cmd = new MySqlCommand())
    {
        cmd.Connection = sqlCon;
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "SELECT * FROM table1 WHERE username = @user AND password = @pass";
        cmd.Parameters.AddWithValue("@user", userId);
        cmd.Parameters.AddWithValue("@pass", password);
        using (MySqlDataAdapter adap = new MySqlDataAdapter(cmd))
        {
            try
            {
                DataSet ds = new DataSet();
                adap.Fill(ds);
            }
            catch (MySqlException e)
            {
                // do something with the exception
                // don't hide it!
            }
        }
    }
}
于 2012-11-08T23:51:14.137 回答