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

C# C SQL登录表单错误语法不正确,c#,sql,database,select,sqldatareader,C#,Sql,Database,Select,Sqldatareader,我正在尝试创建一个登录表单应用程序,当用户在两个文本框中键入并按下按钮时,我的应用程序将检查TeacherDetails表中的用户名和密码列,如果它们出现在表中,则显示它们是正确的 我的插入注册代码工作得非常好 当我按下按钮时,我似乎找不到为什么我的尝试不起作用。出现一个错误,显示: 其他信息:“,”附近的语法不正确 我非常感谢任何人能帮助我解决为什么它不起作用,或者用任何简单的方法来做我想做的事情。谢谢你 以下是我的代码尝试: private void TeacherLoginButton_

我正在尝试创建一个登录表单应用程序,当用户在两个文本框中键入并按下按钮时,我的应用程序将检查TeacherDetails表中的用户名和密码列,如果它们出现在表中,则显示它们是正确的

我的插入注册代码工作得非常好

当我按下按钮时,我似乎找不到为什么我的尝试不起作用。出现一个错误,显示:

其他信息:“,”附近的语法不正确

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

以下是我的代码尝试:

 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");
    }
}
这是表格:

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子句周围的括号:

编辑由于没有提供问题其他方面的详细信息而受到强烈反对

由于只将用户输入连接到SQL查询中,您的代码容易受到攻击。例如,如果用户输入: ",;drop table教师详细信息-

您的SQL查询将转换为:

SELECT [Username], [Password] 
FROM TeacherDetails 
WHERE ([Username]=''); drop table TeacherDetails --' AND [Password]= '');", connect);
导致TeacherDetails表被删除。这只是一个可能发生的例子,他们可能会从TeacherDetails中选择*,让他们访问您的所有用户名和密码,这就引出了下一点

您正在以纯文本形式存储密码。如果有人能够访问您的数据库SQL注入或其他方式,那么获取用户名和密码不需要任何工作。
因此,您可以使用参数化查询、存储过程或ORM实体框架、LINQtoSQL等。

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

SqlCommand command10 = new SqlCommand("SELECT [Username], [Password] FROM TeacherDetails ...
但是,可以说这里还有更严重的问题

当您使用字符串连接时,您的代码是开放的。你应该改用


最后,您将比较纯文本密码,这意味着您的密码存储在纯文本中。最好以加密方式存储密码,然后将加密字符串相互比较。这样,如果您的数据库被压缩,您的密码会更安全。

请使用参数化查询。使用concatation进行sql注入的时机已经成熟。@paqogomez可能值得一提的是,以明文形式存储密码也是一个坏主意…@DGibbs您的意思是以非隐藏方式存储密码吗?我该如何解决这个问题?@mot375使用调试器和quickwatch检查值,我相信您可以很快发现问题。。不要只写我喜欢称之为代码的东西,也就是说写代码,然后运行应用程序,而不需要单步执行代码和/或调试。如果你想传递单词,那么你需要在数据库中查找如何加密密码来吧。。这就是谷歌所做的for@mot375您的密码存储在未加密的明文中。如果您的数据库遭到破坏,您的密码将很容易读取。它们应该是,只比较加密版本。请不要建议在sql中使用连接。重写它以使用参数化查询。我是在回答他提出的问题,而不是提供他没有提出的解决方案。谢谢。谢谢你的下一票,这就是他的问题的原因。@Tom仔细阅读了Sql注入,不管下一票与否。在Sql参数化查询中使用连接通常不是最好的做法。如果您想要更好的建议,我建议您创建一个存储过程。。但是你应该推荐它这就是我所说的“汤姆”。。寒意是当今的流行语。。
SqlCommand command10 = new SqlCommand("SELECT [Username], [Password] FROM TeacherDetails ...