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