所以我正在从事这个项目。 基本上我正在尝试制作一个登录表单。 并且我需要获取表“ users”内的ID,但是我不知道怎么办? 有人可以告诉我它是如何完成的吗?
我尝试将其从bool更改为int并返回ID。
create table users(
id int not null auto_increment,
FirstName varchar(255),
LastName varchar(255),
isTeacher bool,
TeachingSubject varchar(255),
loginUsername varchar(12),
loginPassword varchar(12),
PRIMARY KEY (ID)
);
public bool LoginUser(LoginViewmodel userLogin)
{
var cmdCommand = "select count(1) from users WHERE loginUsername=@LOGINUSER AND loginPassword=@LOGINPASS;";
OpenConnection();
MySqlCommand loginCommand = new MySqlCommand(cmdCommand, studentsConnection);
loginCommand.Parameters.AddWithValue("@LOGINUSER", userLogin.LoginUsername);
loginCommand.Parameters.AddWithValue("@LOGINPASS", userLogin.LoginPassword);
var test = Convert.ToInt32(loginCommand.ExecuteScalar());
userLogin.Id = test;
Console.WriteLine(userLogin.Id);
CloseConnection();
if (test == 1)
{
return true;
}
else
{
throw new BadLoginCredentialsException();
}
}
public class LoginViewmodel
{
public string Firstname { get; set; }
public string Lastname { get; set; }
public bool isTeacher { get; set; }
public string TeachingSubject { get; set; }
public string LoginUsername { get; set; }
public string LoginPassword { get; set; }
public int Id { get; set; }
}
public WorkList()
{
LoginViewmodel userLogin = new LoginViewmodel();
//loginUserId = 1;
lblUserId.Text = userLogin.Id.ToString(); // i need to put the id into a label here
}
它需要将用户ID写入视图模型,以便我可以其他形式使用它们。
答案 0 :(得分:0)
我不确定select语句中的“ count(1)”是什么,如果您希望从“ @LOGINUSER”和“ @LOGINPASS”记录中获取ID,则肯定需要将其为“ id”匹配给定的。
答案 1 :(得分:0)
尝试一下。由于COUNT(1)
将返回匹配数目,因此,如果没有重复项,您将始终得到1或0。您需要用户的实际ID。
将返回类型更改为int
,而不是bool
,并将count(1)
更改为用户ID的实际列名,然后返回该值。
public int LoginUser(LoginViewmodel userLogin)
{
var cmdCommand = "select userIdColumnName from users WHERE loginUsername=@LOGINUSER AND loginPassword=@LOGINPASS;";
OpenConnection();
MySqlCommand loginCommand = new MySqlCommand(cmdCommand, studentsConnection);
loginCommand.Parameters.AddWithValue("@LOGINUSER", userLogin.LoginUsername);
loginCommand.Parameters.AddWithValue("@LOGINPASS", userLogin.LoginPassword);
var test = Convert.ToInt32(loginCommand.ExecuteScalar());
userLogin.Id = test;
Console.WriteLine(userLogin.Id);
CloseConnection();
if (test > 0)
{
return test;
}
else
{
return 0
}
}
请注意退货中的更改
if (test > 0)
{
return test;
}
else
{
return 0
}
只要没有用户将userId设置为0,就可以解决您的问题。
答案 2 :(得分:0)
首先更改您在方法中使用的SQL。如果您计算行数,您将无法获得用户ID(至少我不认为可以) 因此,使您的SQL像这样:
"select * from users WHERE loginUsername=@LOGINUSER AND loginPassword=@LOGINPASS";
使用
更改MySqlCommandMySqlDataAdapter dtReader = new MySqlDataAdapter(cmdCommand, con);
//con is your connection ofc
之后,您可以像这样
检索返回的值。DataTable dt = new DataTable();
dtReader.Fill(dt);
然后,您只需在dt.Rows和dt.Rows中进行for循环即可。如果需要,您可以计数。
一旦您从SQL获得正确的信息,您就有2个选项,您可以更改方法的返回类型,也可以在方法中使用OUT参数删除该值。 对于输出,您必须像这样更改您的方法:
public bool LoginUser(LoginViewmodel userLogin, out string UserId)
{
var cmdCommand = "select count(1) from users WHERE loginUsername=@LOGINUSER AND loginPassword=@LOGINPASS;";
OpenConnection();
MySqlDataAdapter dtReader = new MySqlDataAdapter(cmdCommand, con);
dtReader.SelectCommand.Parameters.AddWithValue("@LOGINUSER", userLogin.LoginUsername);
dtReader.SelectCommand.Parameters.AddWithValue("@LOGINPASS", userLogin.LoginPassword);
DataTable dt = new DataTable();
dtReader.Fill(dt);
if (dt.Rows.Count == 1)
{
UserId = dt.Rows[0]["Id"].ToString();
return true;
}
else
{
throw new BadLoginCredentialsException();
}
}