C#SQL错误INNER JOIN数据正在显示,不知道为什么

时间:2016-06-05 08:25:23

标签: c# sql

我遇到的问题是我创建了一个程序,用户可以登录以检查他们的帐户信息(使用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();

2 个答案:

答案 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())
        {
           ....
        }
    }
}