使用本地 SQL 数据库创建登录表单,在执行时和尝试登录后发生 "ArgumentException Unhandled" 错误

Created a login form with a local SQL database, upon execution and after a login attempt an "ArgumentException Unhandled" error occurs

我知道之前有人问过同样的问题,但由于一个简单的错字而关闭了。据我所知,我没有任何拼写错误,我试图通过谷歌搜索找出问题,但没有成功。

我创建了这个登录 Window。 Main Login Window

我在 Visual Studio (2015) 中创建了一个本地 SQL 数据库来存储我的用户。为了建立与该数据库的连接,我在主登录 Window.

中可见的 Enter 按钮中编写了这行代码
SqlConnection sqlConn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;Initial Catalog=C: \USERS\NIKOS\DESKTOP\NIKOS();\SAFE BOX\DATABASE\SAFEBOXDB.MDF;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False");

此路径已通过右键单击我的数据库并选择属性来粘贴。在属性中有一个名为连接字符串的字段。这就是我复制并粘贴到代码中的上述路径中的内容。

这是我的全部代码。

        //Find path for SQL Connection
        SqlConnection sqlConn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;Initial Catalog=C:\USERS\NIKOS\DESKTOP\NIKOS();\SAFE BOX\DATABASE\SAFEBOXDB.MDF;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False");
        //Add query for actions to be taken once connection is established, select the user
        string sqlQuery = "Select * from dbo.Table Where username = '" + txtEnterUserName.Text.Trim() + "' and password = '" + txtEnterPassword.Text.Trim();
        //Add SQL Data Adapter passing in the connection and the query
        SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sqlQuery, sqlConn);

        //Create new Datatable object
        DataTable dataTable = new DataTable();
        //Fill SQL Data Adapter with the dataTable
        sqlDataAdapter.Fill(dataTable);

        if (dataTable.Rows.Count == 1)
        {
            loginMain objFormMain = new loginMain();
            this.Hide();
            UserDashboard userDash = new UserDashboard();
            userDash.Show();
        }
        else
        {
            MessageBox.Show("Check Username and Password");
        }

当我 运行 程序时,我的主登录 Window 出现,因为它是主 window,我根据 table 在数据库中输入我的凭据,然后我一按 "Enter" 按钮就收到这个错误。

ArgumentException was unhandled

我检查并重新检查了路径,但似乎无法正常工作,我也不知道问题出在哪里。一般 Google 搜索没有帮助。

由于我是新用户,信誉不佳,我无法上传 table 数据,我只有一行用户名和密码。假设这些输入正确。

错误提示不支持关键字。我似乎无法理解这一点。

编辑。我已经重新安装了服务器,新路径现在是

using (SqlConnection sqlConn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\Nikos\Documents\SafeBox.mdf;Integrated Security=True;Connect Timeout=30"))

根据新的连接字符串。所以 Enter 按钮的新代码现在是

private void enterButton_Click(object sender, EventArgs e)
    {
        string sqlQuery = @"Select * from dbo.Table 
                Where username = @user AND 
                      password = @pass";
        using (SqlConnection sqlConn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\Nikos\Documents\SafeBox.mdf;Integrated Security=True;Connect Timeout=30"))
        using (SqlCommand cmd = new SqlCommand(sqlQuery, sqlConn))
        {
            sqlConn.Open();
            cmd.Parameters.Add("@user", SqlDbType.NVarChar).Value = txtEnterUserName.Text.Trim();
            cmd.Parameters.Add("@pass", SqlDbType.NVarChar).Value = txtEnterPassword.Text.Trim();

            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                if (reader.HasRows)
                {
                    loginMain objFormMain = new loginMain();
                    this.Hide();
                    UserDashboard userDash = new UserDashboard();
                    userDash.Show();
                }
                else
                {
                    MessageBox.Show("Check Username and Password");
                }
            }
        }
    }

我遇到的新错误是{"Incorrect syntax near the keyword 'Table'."},错误指向这一行。

using (SqlDataReader reader = cmd.ExecuteReader())

你的代码有很多错误。

第一个是C:盘符和剩余路径之间的space是错误的,应该去掉。此外,在连接字符串的中间添加一个分号作为路径的一部分会使使用分号作为键和值之间分隔符的连接字符串解析器感到困惑。这是错误消息的来源,因为在 NIKOS(); 之后分号表示解析器结束对路径的发现并尝试理解 \SAFE BOX.... 因为它是解析的关键。
您应该将其从磁盘路径中删除并调整您的连接字符串

SqlConnection sqlConn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;
      Initial Catalog=C:\USERS\NIKOS\DESKTOP\NIKOS\SAFE BOX\DATABASE\SAFEBOXDB.MDF;
       Integrated Security=True;
       Connect Timeout=30;
       Encrypt=False;
       TrustServerCertificate=True;
       ApplicationIntent=ReadWrite;
       MultiSubnetFailover=False");

现在代码问题更严重了

string sqlQuery = @"Select * from [Table] 
                    Where username = @user AND 
                          password = @pass";
using(SqlConnection sqlConn = new SqlConnection(....))
using(SqlCommand cmd = new SqlCommand(sqlQuery, sqlConn))
{
     sqlConn.Open();
     cmd.Parameters.Add("@user", SqlDbType.NVarChar).Value = txtEnterUserName.Text.Trim();
     cmd.Parameters.Add("@pass", SqlDbType.NVarChar).Value = txtEnterPassword.Text.Trim();

     using(SqlDataReader reader = cmd.ExecuteReader())
     {
         if(reader.HasRows)
         {
              loginMain objFormMain = new loginMain();
              this.Hide();
              UserDashboard userDash = new UserDashboard();
              userDash.Show();
         }
         else
         {
              MessageBox.Show("Check Username and Password");
         }
    }
}

首先,如果您只想检查用户是否存在,则不需要复杂的 SqlDataAdapter。带有 SqlDataReader 的简单 Sql 命令就可以了。
其次,所有一次性对象都应该放在 using 语句中,以确保当您完成使用它们时,它们也会在异常情况下被销毁。

最后,当您需要将值传递到数据库时,参数总是可行的。如果您的字符串包含单引号,不使用它们将导致 Sql 注入攻击或意外语法错误。