Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.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# 奇怪的是SQLServerManagementStudio中的数据_C#_Asp.net_Sql Server - Fatal编程技术网

C# 奇怪的是SQLServerManagementStudio中的数据

C# 奇怪的是SQLServerManagementStudio中的数据,c#,asp.net,sql-server,C#,Asp.net,Sql Server,我正在ASP.NET中制作一个简单的项目,并使用此代码继续登录、检测角色并打开确切的页面 string cmdText = "SELECT Username,Role FROM Login WHERE Username = '" + TextBox1.Text + "' AND Password = '" + TextBox2.Text + "'"; string username = ""; string role = ""; using (SqlCommand SelectCommand

我正在ASP.NET中制作一个简单的项目,并使用此代码继续登录、检测角色并打开确切的页面

string cmdText = "SELECT Username,Role FROM Login WHERE Username = '" + TextBox1.Text + "' AND Password = '" + TextBox2.Text + "'";

string username = "";
string role = "";

using (SqlCommand SelectCommand = new SqlCommand(cmdText, connectionstring))
{
    SqlDataReader myReader;
    connectionstring.Open();

    myReader = SelectCommand.ExecuteReader();

    while (myReader.Read())
    {
        username = myReader["Username"].ToString();
        role = myReader["Role"].ToString();
    }

    myReader.Close();

    Response.Redirect(role + ".aspx");
}
我将其设置为
role+”.aspx“
,因为我在if函数中遇到了一些奇怪的错误。。它工作不正常

但是重定向到页面时仍然有问题。。我注意到了这一点

因此,被这个错误弄糊涂了,我决定检查SQL Server中的数据,结果如下:

角色后有5个空格。。我试图删除它们。但在保存数据后,空间会再次消失。。我注意到名字和密码也是一样的

但是现在有9个空格。。看起来SQL Server Management Studio正在尝试填充最多10个字母

用户名
密码
角色
nchar(10)
类型。。这就是问题所在吗

我应该换衣服来修吗?或者也可以通过其他方式完成

您应该使用nvarchar(10)而不是nchar(10)。char和nchar将始终具有固定的长度。因此,如果在nchar(10)或char(10)中存储一个“a”,它将在右侧填充10个字符的空格。如果您将其存储为nvarchar(10),它将存储为字符串的长度

仅当列的长度始终相同时才使用nchar和char

从nchar转换为nvarchar后。您还应该更新列中的数据,以便它们不再有尾随空格。(对要转换的所有列执行此操作)


nchar
列将其值存储在固定长度的空间中。如果您将一列声明为nchar(10)类型,则所有值都用空格填充,以达到10个字符的长度。
如果您可以更改模式,则将列更改为
nvarchar(10)
类型,并且(不确定)可能需要重新编辑所有已经存在的值

如果不能更改模式,则可以在代码中修剪结果

 Response.Redirect(role.Trim() + ".aspx");
然而,看看你的代码,我发现了一个很大的问题。您正在使用famigerate字符串连接来构建查询。这是众所周知的代码缺陷,会导致和导致解析错误。
您应该尽快使用参数修复该查询

string cmdText = "SELECT Role FROM Login WHERE Username = @name AND Password = @pass";
// You already know the username
string username = textBox1.Text;
string role = "";
using (SqlCommand SelectCommand = new SqlCommand(cmdText, connectionstring))
{
    connectionstring.Open();
    SelectCommand.Parameters.Add("@name", SqlDbType.NVarChar).Value = textBox1.Text;
    SelectCommand.Parameters.Add("@pass", SqlDbType.NVarChar).Value = textBox2.Text;

    using(SqlDataReader myReader = SelectCommand.ExecuteReader())
    {
        while (myReader.Read())
        {
            role = myReader["Role"].ToString();
        }
    }
    Response.Redirect(role.Trim() + ".aspx");
}
最后,请注意,将明文存储在数据库中的密码是另一个安全弱点。一个众所周知的好做法是,在将其存储到数据库之前,您可以在c代码中使用trim()来防止url中出现%20(空格),这是因为数据库返回的角色是“admin”(空格)而不是“admin”,有两个选项

1. string cmdText = "SELECT Username,LTrim(RTrim(Role)) FROM Login WHERE Username = '" + TextBox1.Text + "' AND Password = '" + TextBox2.Text + "'";
(或)


@史蒂夫:所以我应该选择varchar或nvarchar来解决这个问题?谢谢史蒂夫,但是怎么办呢?修剪到文本?它删除了空格?是的,请看字符串。在MSDN上修剪。非常感谢Steve。我是个新手,这教会了我很多。
1. string cmdText = "SELECT Username,LTrim(RTrim(Role)) FROM Login WHERE Username = '" + TextBox1.Text + "' AND Password = '" + TextBox2.Text + "'";
2.  Response.Redirect(role.trim() + ".aspx");