错误说"No value given for one or more required parameters"



我的代码有什么问题吗?因为,我将要创建登录表单,而不是。

OleDbConnection conDataBase = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0; Data Source = C:UserstessDocumentsiknow.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");
}

您有几个问题,正如乔恩·斯基特(Jon Skeet(指出的那样,您已经引入了SQL注入漏洞,没有实施using语法来正确处理资源,并且有一个参数,但是't实际实现(这很难识别,没有更多代码或标记此错误的标记(。

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.
          }
}

因此上述代码将解决以下内容:

  • 注射点
  • 处置资源
  • 将命令正确关联到连接
  • 没有理由 *为所有事物,如果您只想查看它是否存在。
  • 您真的应该只有一个用户名,因此前1个可以完善。

您还可以使用ExecuteScalar而不是阅读器,这样您就可以简单地验证记录已返回。这将减轻返回的记录集进行迭代的需求。如果您排名前1,并且只有一个用户名,那就没关系,但这是一种选择。

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

相关内容

最新更新