我在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
存储在单独的变量中。
我该如何做到这一点?
答案 0 :(得分: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())
...................
}
但更真实地存储凭据,您应该使用类似Membership system的内容,而不是自己滚动。
答案 1 :(得分:7)
You're running a huge risk of sql injection with that.将SQL参数用于SqlCommands中的值。
答案 2 :(得分: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);
答案 3 :(得分: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);
}
答案 4 :(得分:0)
string userName = txt4name.Text;
string password = txt4pwd.Text;
这真的是你想要的吗?只是将数据转化为变量?
答案 5 :(得分:0)
您确实需要使用参数化SQL。 There's an example here 此外,你的问题确实没有意义;你想要单独的变量用户名和密码?他们已经在你的例子中分开了。如果您无法将它们分配给字符串,我建议您遵循一些tutorials。
答案 6 :(得分:0)
另一种方法是将读者结果加载到DataTable中,如下所示:
DataTable Result = new DataTable();
Result.Load(reader);
如果您的登录表只包含两个唯一的列(userName和password),那么您最终会得到只包含一行信息的Result。然后,您可以从每列获取列值:
string userName = Result.Rows[0].Field<string>("userName");
string password = Result.Rows[0].Field<string>("pwd");
答案 7 :(得分: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");
}
}
答案 8 :(得分:-3)
您通常可以在MSDN上找到基本用法示例,例如this one for SqlDataReader。