Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#SQL错误的内部联接数据显示在';我不知道为什么_C#_Sql - Fatal编程技术网

C#SQL错误的内部联接数据显示在';我不知道为什么

C#SQL错误的内部联接数据显示在';我不知道为什么,c#,sql,C#,Sql,我的问题是,我制作了一个程序,用户可以登录以检查他们的帐户信息(使用SQL数据库中的用户名和密码登录),但是如果我使用详细信息a登录,然后注销并使用详细信息B登录。它仍然会显示用户a的帐户信息,但使用用户B登录详细信息 public string Username { get; set; } //从登录表单(另一个表单)获取用户名// 您没有在查询中指定用户名。联接只会返回所有用户的所有记录。如果要获取特定用户的数据,需要使用以当前用户的名称传递的参数化查询 此查询没有WHERE条件,因此您的

我的问题是,我制作了一个程序,用户可以登录以检查他们的帐户信息(使用SQL数据库中的用户名和密码登录),但是如果我使用详细信息a登录,然后注销并使用详细信息B登录。它仍然会显示用户a的帐户信息,但使用用户B登录详细信息

public string Username { get; set; }
//从登录表单(另一个表单)获取用户名//


您没有在查询中指定用户名。联接只会返回所有用户的所有记录。如果要获取特定用户的数据,需要使用以当前用户的名称传递的参数化查询

此查询没有WHERE条件,因此您的代码获取联接生成的所有数据,但由于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())
        {
           ....
        }
    }
}

此查询没有WHERE条件,因此您的代码获取联接生成的所有数据,但因为您的while循环将前一个循环中的所有数据替换为当前循环中的所有数据,因此最终您的控件始终显示最后一个用户的数据。确实-我认为与C无关,这里,真的。。。如果直接在SQL Studio或其他任何地方执行该查询,您将看到相同的结果。很抱歉,我不知道如何执行该查询,我尝试了,但失败了,出现了一个错误“必须声明标量变量”我如何设置用户名公共字符串username{get;set;}txtUsernameUser.Text=username;这是一个奇怪的错误。该参数称为
@user
。您需要使用属性Username的值设置此参数的值,或者在设置Username参数之前调用控件txtUsernameUser.ExecuteReader的文本。请使用如上所示的using语句。使用语句对于避免连接、命令和读取器等一次性对象上的内存泄漏至关重要
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())
        {
           ....
        }
    }
}