错误说"没有给出一个或多个必需参数的值"

时间:2018-02-05 15:25:33

标签: c# ms-access

我的代码有什么问题吗?因为,我即将创建一个登录表单而且它没有。

OleDbConnection conDataBase = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0; Data Source = C:\Users\tess\Documents\iknow.accdb;" + "Persist Security Info = True");
OleDbCommand cmdDataBase = new OleDbCommand(" select * from iknow where Username = '"+user_NameTextBox.Text+"'");
cmdDataBase.Connection = conDataBase;
OleDbDataReader myReader;

conDataBase.Open();
myReader = cmdDataBase.ExecuteReader();
int count = 0;
while (myReader.Read())
{
    count = count + 1;
}
if (count == 1)
{
    MessageBox.Show("Login Successful");
}
else
{
    MessageBox.Show("Invalid Username");
}

1 个答案:

答案 0 :(得分:0)

你有几个问题,因为Jon Skeet指出你引入了一个SQL注入漏洞,没有实现using语法来正确处理资源,并且有一个参数但实际上没有实现(这很难识别,没有更多代码或标记此错误的内容)。

var query = "SELECT TOP 1 [Id] FROM User WHERE Username = @Username";
using(var connection = new OleDbConnection(path))
using(var command = new OleDbCommand(query, connection))
{
     connection.Open();
     command.Parameters("Username", txtUsername.Text());
     using(var reader = command.ExecuteReader())
          while(reader.Read())
          {
               // Do something.
          }
}

所以上面的代码将解决以下问题:

  • 注射点
  • 处置资源
  • 正确地将命令与连接相关联
  • 没有理由*为了一切,如果你只是想知道它是否存在。
  • 你应该只有一个用户名,因此TOP 1可以改进。

您也可以使用ExecuteScalar代替阅读器,这样您就可以简单地验证返回的记录。这将减少迭代返回的记录集的需要。如果你是TOP 1并确保只存在一个用户名,那么无关紧要,但这是一个选项。

至于您的参数,我们需要更多信息。调试器应该告诉你哪一行抛出了异常。这些细节可以帮助解决问题。