我有一个需要两个字段的登录表单。一个是电子邮件,另一个是密码。我想从数据库中获取电子邮件和密码,然后将其与用户输入的电子邮件和密码进行匹配。 到目前为止,我已经做到了这一点。
public int checkLogin(String email,String pass)
{
try
{
conn = new OleDbConnection();
cmd = new OleDbCommand();
da = new OleDbDataAdapter();
ds = new DataSet();
conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:\\Users\\He Man\\Documents\\Project.accdb";
conn.Open();
cmd.CommandText = "SELECT Email, [Password] FROM UserProfile"
+" where Email='"+email+"' and Password='"+pass+"';";
int checkPoint=0;
da.SelectCommand = cmd;
da.Fill(ds);
for (int i = 0; i < ds.Tables["UserProfile"].Rows.Count; i++)
{
if (ds.Tables["UserProfile"].Rows[i]["Email"].ToString() == email && ds.Tables["UserProfile"].Rows[i]["[Password]"].ToString() == pass)
{
checkPoint = 1;
}
else
{
checkPoint =0;
}
}
conn.Close();
return checkPoint;
}
catch(Exception)
{
return 0;
}
}
如果数据匹配则返回1,如果不匹配则返回0帮助。我只想将我的数据与数据集中的每个数据值进行匹配。
答案 0 :(得分:3)
你做错了太多。
你绝对不需要这样做
if (ds.Tables["UserProfile"].Rows[i]["Email"].ToString() == email ...
因为,您的查询具有where
条件,即如果用户名和密码不匹配,您的DataSet将为空,因此您最好检查您的ds是否为空。< / p>
您很容易SQL Injection
。 7年级的孩子可以放弃整个数据库。不要使用连接字符串作为命令查询,使用参数化字符串,即
query = "Select Count(*) From UserProfile Where Username= @username and
Password=@password";
OleDbCommand cmd = new OleDbCommand(query, conn);
cmd.Parameters.AddWithValue("@username", txtUsername.Text);
cmd.Parameters.AddWithValue("@password", txtPassword.Text);
int result = (int)cmd.ExecuteScalar();
if(result.Equals(1))
{
//successful login
}
else
{
//login failed
}
你不应该在任何地方创建Connection
和Command
对象,你可以创建包装所有这些db-details的类,并公开只接受查询字符串和参数作为参数并返回数据集的函数或者标量结果,如:
public DataTable GetSelectQueryResult(string query, OleDbParameter[] parameters)
{
var con = GetConnection();
//rest of the logic
}
答案 1 :(得分:1)
替换这个:
for (int i = 0; i < ds.Tables["UserProfile"].Rows.Count; i++)
{
if (ds.Tables["UserProfile"].Rows[i]["Email"].ToString() == email && ds.Tables["UserProfile"].Rows[i]["[Password]"].ToString() == pass)
{
checkPoint = 1;
}
else
{
checkPoint = 0;
}
}
使用:
checkPoint = ds.Tables["UserProfile"].Rows.Count>0 ? 1 : 0;