我遇到的问题是我创建了一个程序,用户可以登录以检查他们的帐户信息(使用SQL数据库中的用户名和密码登录)但是如果我使用详细信息登录A然后注销并登录详细信息B.它仍将显示用户A的帐户信息,但用户B登录详细信息。
public string Username { get; set; }
//从登录表单获取用户名(另一种形式)//
SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=E:\Graded unit Dev\BlackMarch\BlackMarch\bin\Debug\DataBaseBM.mdf;Integrated Security=True;Connect Timeout=30");
/* (2) */
SqlCommand cmd = new SqlCommand(@"SELECT *
FROM UserData
INNER JOIN HotelData
ON (UserData.Username = HotelData.Username) ", con);
cmd.CommandType = CommandType.Text;
cmd.Connection = con;
con.Open();
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
txtboxPass.Text = dr["password"].ToString();
txtboxFN.Text = dr["FirstName"].ToString();
txtboxSurname.Text = dr["Surname"].ToString();
txtboxAge.Text = dr["Age"].ToString();
txtboxGender.Text = dr["Gender"].ToString();
txtboxMobile.Text = dr["Mobile"].ToString();
txtboxEmail.Text = dr["Email"].ToString();
txtboxRoomType.Text = dr["RoomType"].ToString();
txtboxNoRooms.Text = dr["NoOfRooms"].ToString();
txtboxPackage.Text = dr["PackageDeal"].ToString();
txtboxGym.Text = dr["Gym"].ToString();
txtboxBeach.Text = dr["Beach"].ToString();
txtboxPool.Text = dr["SwimmingPool"].ToString();
txtboxSports.Text = dr["SportsGround"].ToString();
txtDate.Text = dr["StartDateR"].ToString();
strNoNights = dr["NoOfNights"].ToString();
strNoDays = dr["NoOfDays"].ToString();
答案 0 :(得分:0)
您没有在查询中指定用户名。联接将只返回所有用户的所有记录。如果要获取特定用户的数据,则需要使用以当前用户名称传递的参数化查询。
答案 1 :(得分:0)
此查询没有WHERE条件,因此您的代码获取JOIN生成的所有数据,但因为您的while循环使用当前循环替换上一循环中的所有数据,最终您的控件始终显示上一个用户的数据读
要解决此问题,您需要为sql文本添加WHERE条件,以便只检索当前登录用户的数据。从您的代码我不知道如何存储登录用户的用户名,所以我们假设它存储在名为UserName的变量
中string cmdText = @"SELECT *
FROM UserData
INNER JOIN HotelData
ON (UserData.Username = HotelData.Username)
WHERE UserData.UserName = @user";
using(SqlConnection con = new SqlConnection(@"....."))
using(SqlCommand cmd = new SqlCommand(cmdText, con);
{
con.Open();
cmd.Parameters.Add("@user", SqlDbType.NVarChar).Value = UserName;
using(SqlDataReader dr = cmd.ExecuteReader())
{
// Now this will loop just one time, only for the logged in user
while (dr.Read())
{
....
}
}
}