Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 错误是“不”;没有给出一个或多个所需参数的值“;_C#_Ms Access - Fatal编程技术网

C# 错误是“不”;没有给出一个或多个所需参数的值“;

C# 错误是“不”;没有给出一个或多个所需参数的值“;,c#,ms-access,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("

我的密码有什么问题吗?因为,我要创建一个登录表单,但它没有

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");
}

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

因此,上述代码将解决以下问题:

  • 注入点
  • 配置资源
  • 将命令正确关联到连接
  • 如果你只想知道它是否存在的话,就没有理由对所有事情都这么做
  • 您实际上应该只有一个用户名,这样TOP1就可以进行优化
您还可以使用
ExecuteScalar
而不是reader,这样您就可以简单地验证返回的记录。这将减少遍历返回记录集的需要。如果您排名前1,并确保只有一个用户名存在,这无关紧要,但这是一个选项


至于你的参数,我们需要更多的信息。调试器应该告诉您哪一行引发异常。这些详细信息有助于解决问题。

是否有可能返回超过1行??在这种情况下,您应该检查计数>=1。同样非常重要的是:谨防SQL注入。首先,我要介绍SQL注入攻击漏洞,即将用户提供的值直接放入SQL中。总是参数化SQL。这篇文章缺少清晰的问题描述。首先调试,检查是否输入了while循环,在Access中手动运行查询并检查是否返回任何内容。没有专门针对Microsoft Access的条目,但是调试器没有告诉我哪一行引发异常,它只是显示一个消息框,说明没有为一个或多个必需参数指定值。但我会记住你说的话。
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.
          }
}