C# SQL 登录表单错误语法不正确

C# SQL Login form error incorrect syntax

我正在尝试创建一个登录表单应用程序,当用户在两个文本框中输入内容并按下按钮时,我的应用程序会检查我的 TeacherDetails table 的用户名和密码列,以及它们是否存在于table 它显示它们是正确的。

(我的 INSERT 注册代码完美运行)

我似乎无法找到为什么当我按下按钮时我的尝试不起作用,出现错误提示:

Additional information: Incorrect syntax near ','.

我非常感谢任何可以帮助我解决它为什么不起作用或以任何更简单的方法来做我想做的事情的人。谢谢!!!

这是我的代码尝试:

 private void TeacherLoginButton_Click(object sender, EventArgs e)
 {
    string connectionString = ConfigurationManager.ConnectionStrings["myconnectionstring"].ConnectionString;
    SqlConnection connect = new SqlConnection(connectionString);
    connect.Open();

    SqlCommand command10 = new SqlCommand("SELECT ([Username], [Password]) 
    FROM TeacherDetails 
    WHERE ([Username]='" + this.usernameTlogin.Text + "' 
    AND [Password]= '" + this.passwordTlogin.Text +"');", connect);

    SqlDataReader reader;
    reader = command10.ExecuteReader();
    int count = 0;
    while (reader.Read())
    {
        count = count + 1;
    }
    if( count == 1)
    {
        MessageBox.Show("Username and password is correct");
    }
    else if (count > 1)
    {
        MessageBox.Show("BEEP BOOP ERROR");
    }
    else
    {
       MessageBox.Show("Username or password is incorrect");
    }
}

这里是 table:

CREATE TABLE [dbo].[TeacherDetails] (
[TeacherID]     INT           IDENTITY (1, 1) NOT NULL,
[First Name]    NVARCHAR (50) NULL,
[Last Name]     NVARCHAR (50) NULL,
[Title]         NVARCHAR (50) NULL,
[Username]      NVARCHAR (50) NULL,
[Password]      NVARCHAR (50) NULL,
[Email Address] NVARCHAR (50) NULL,
PRIMARY KEY CLUSTERED ([TeacherID] ASC)

);

删除 SELECT 子句周围的括号:

SqlCommand command10 = new SqlCommand("SELECT [Username], [Password] FROM TeacherDetails WHERE ([Username]='" + this.usernameTlogin.Text + "' AND [Password]= '" + this.passwordTlogin.Text +"');", connect);

编辑 (由于没有提供问题的其他细节的强烈反对)

  1. 由于简单地将用户输入连接到 SQL 查询中,您的代码容易受到 SQL Injection 的攻击。例如,如果用户输入:

'); drop table TeacherDetails--

您的 SQL 查询将变成:

SELECT [Username], [Password] 
FROM TeacherDetails 
WHERE ([Username]=''); drop table TeacherDetails --' AND [Password]= '');", connect);

导致您的 TeacherDetails table 被删除。这只是可能发生的情况的一个示例,他们可能 SELECT * FROM TeacherDetails 授予他们访问您所有用户名和密码的权限,这导致了下一点。

  1. 您正在以明文形式存储密码。如果有人可以访问您的数据库(SQL 注入或其他方式),则不需要 任何 的工作来获取用户名和密码。

因此,您可以使用参数化查询、存储过程或 ORM(Entity Framework、LINQtoSQL 等...)

这里有一些问题。首先,回答您的实际问题 - 您的 select 语法不正确。您不应将 select 列表中的列括起来:

SqlCommand command10 = new SqlCommand("SELECT [Username], [Password] FROM TeacherDetails ...

但是,这里也存在(可以说更严重的)问题。

您的代码对 SQL injection attacks as you are using string concatenation. You should be using parameterized queries 开放。

最后,您比较的是明文密码,这意味着您的密码以明文形式存储。最好以加密方式存储您的密码,然后将加密的字符串相互比较。这样,如果您的数据库曾经被破坏,您的密码是安全的 (r)。