我的代码有什么问题吗?因为,我即将创建一个登录表单而且它没有。
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");
}
答案 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.
}
}
所以上面的代码将解决以下问题:
您也可以使用ExecuteScalar
代替阅读器,这样您就可以简单地验证返回的记录。这将减少迭代返回的记录集的需要。如果你是TOP 1并确保只存在一个用户名,那么无关紧要,但这是一个选项。
至于您的参数,我们需要更多信息。调试器应该告诉你哪一行抛出了异常。这些细节可以帮助解决问题。