4

我的btn_click活动中有以下代码:

Sqlconnection con = new Sqlconnection("server=.;database=bss;user id=ab;pwd=ab");
con.open();
SqlCommand cmd = new Sqlcommand("select * from login where username='" 
+ txt4name.Text + "' and pwd='" + txt4pwd.Text + "'", con);

SqlDataReader reader = cmd.execute Reader();

login表在哪里,username并且pwd是它的字段。在此代码之后,所有值都存储在reader对象中。我想将username和存储pwd在单独的变量中。

我怎样才能做到这一点?

4

9 回答 9

12

通常,在访问您的数据库时,您应该使用与此类似的东西来消除 SQL 注入漏洞:

using (SqlCommand myCommand = new SqlCommand("SELECT * FROM USERS WHERE USERNAME=@username AND PASSWORD=HASHBYTES('SHA1', @password)", myConnection))
    {                    
        myCommand.Parameters.AddWithValue("@username", user);
        myCommand.Parameters.AddWithValue("@password", pass);

        myConnection.Open();
        SqlDataReader myReader = myCommand.ExecuteReader())
        ...................
    }

但更实际地存储凭据,您应该使用会员系统之类的东西,而不是自己滚动。

于 2009-02-19T14:07:11.930 回答
7

你冒着巨大的 sql 注入风险。 对 SqlCommands 中的值使用 SQL 参数。

于 2009-02-19T14:02:25.560 回答
4

如果您的意思是 c# 变量,并且您想从 db 中获取它们,只需执行以下操作:

SqlDataReader reader = cmd.execute Reader();
if (reader.Read())
{
    string username = reader["username"];
    string pwd = reader["password"];
}

当您使用它时,参数化您的查询并防止 sql 注入:

SqlCommand cmd = new Sqlcommand("select * from login where username=@username and pwd=@pwd", con);
cmd.Parameters.AddWithValue("@username", txt4name.Text);
cmd.Parameters.AddWithValue("@pwd", txt4pwd.Text);
于 2009-02-19T14:07:38.217 回答
2

绝对注意有关 SQL 注入的建议,但这里是您问题的答案:

String username;
String pwd;

int columnIndex = reader.GetOrdinal("username");

if (!dataReader.IsDBNull(columnIndex))
{
    username = dataReader.GetString(columnIndex);
}

columnIndex = reader.GetOrdinal("pwd");

if (!dataReader.IsDBNull(columnIndex))
{
    pwd = dataReader.GetString(columnIndex);
}
于 2009-02-19T14:08:25.903 回答
0
string userName =  txt4name.Text;
string password =  txt4pwd.Text;

这真的是你想要的吗?只是为了将这些数据转换为变量?

于 2009-02-19T14:06:19.107 回答
0

您确实需要使用参数化 SQL。这里有一个例子 此外,您的问题没有任何意义;你想把用户名和密码放在单独的变量中吗?在您的示例中,它们已经是分开的。如果您无法将它们分配给字符串,我建议您遵循一些教程

于 2009-02-19T14:11:23.417 回答
0

另一种方法是将阅读器结果加载到 DataTable 中,如下所示:

DataTable Result = new DataTable();

Result.Load(reader);

如果您的登录表仅包含唯一的两列(用户名和密码),您最终会得到仅包含一行信息的结果。然后,您可以从每列中获取列值:

string userName = Result.Rows[0].Field<string>("userName");
string password = Result.Rows[0].Field<string>("pwd");
于 2009-02-19T14:20:31.540 回答
0
private void but_login_Click(object sender, EventArgs e)
{
    string cn = "Data Source=.;Initial Catalog=mvrdatabase;Integrated Security=True";
    SqlConnection con = new SqlConnection(cn);
    con.Open();
    SqlCommand cmd = new SqlCommand("select count (*) from logintable where username ='" + txt_uname.Text + "'and password='" + txt_pass.Text + "'", con);
    int i = Convert.ToInt32(cmd.ExecuteScalar());
    con.Close();

    if (i == 1)
    {
        Form2 f2 = new Form2();
        MessageBox.Show("User login successfully........");
        this.Hide();
        f2.Show();
    }
    else
    {
        MessageBox.Show("INCORRECT USERID AND PASSWORD", "Error");
    }
}
于 2015-02-24T12:26:34.647 回答
-3

您通常可以在 MSDN 上找到基本的使用示例,例如SqlDataReader

于 2009-02-19T14:13:13.490 回答