以前尝试使用用户名和密码创建登录页面。 但是,由于我的用户表有3个角色,我想创建一个登录页面,根据用户的角色授予用户登录权限。
例如:Admin to admin页面,Staff to staff page etc.
在尝试实现此操作时,在我的一行中遇到以下错误: OleDbException未处理,没有给出一个或多个参数的值。
这是我的登录代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
namespace AcuSapp
{
public partial class Login : Form
{
OleDbConnection LoginLink = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\SB18\\Documents\\Visual Studio 2010\\Projects\\AcuSapp\\AcuSapp\\bin\\debug\\AcuzioSecureStore DatabaseX.accdb");
public Login()
{
InitializeComponent();
//textBox_username.Text = "LittleJohn";
//textBox_password.Text = "HelloJohn";
}
private void button_login_Click(object sender, EventArgs e)
{
string username = textBox_username.Text;
string password = textBox_password.Text;
string role_name = comboBox_role.Text;
//this is to give notification if username and password is lesser than 4 characters
// .length will count the characters in the string
// This is to reduce redundant calls. Less calls = less taxing on the db
if ((username.Length < 4) || (password.Length < 4))
{
MessageBox.Show("Wrong Credentials!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
// Set authentication as false. By default, user is not authenticated yet.
bool isAuthenticated = false;
//Opens the connection to db
LoginLink.Open();
// Sets the SQL command to be executed
// Since it is a variable command, it becomes a new SQL command to be executed in Microsoft access
// + is to join the string together
//Does string comparing to see if username and password match exactly, case sensitive.
//var cmd = new OleDbCommand("SELECT COUNT(*) FROM [User] WHERE username = '" + username + "' AND password = '" + password + "' ", LoginLink);
var cmd = new OleDbCommand("SELECT COUNT(*) FROM [User] WHERE STRCOMP(username, '" + username + "', 0) = 0 AND STRCOMP(password, '" + password + "', 0) = 0 AND STRCOMP(role_name, '" + role_name + "', 0) = 0", LoginLink);
// (int)cmd.ExecuteScalar only reads the first few rows from the db
isAuthenticated = (int)cmd.ExecuteScalar() == 1; //Error on this line.
//Closes connection to db
LoginLink.Close();
// if isAuthenticated is true
if (isAuthenticated)
{
// This will open the next page which is form1
Client hello = new Client(this);
hello.Show();
// Hides the login form
this.Hide();
}
else
{
//Always remember to put the last statement in curly braces
//otherwise it wont show the previous error will show this messsage instead
MessageBox.Show("Wrong Credentials!");
}
}
}
}
}
答案 0 :(得分:1)
您的连接字符串看起来有些偏差。您有两个数据源定义,其中一个数据源被分配了一个不是有效数据源的提供者:
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\SB18\\Documents\\Visual Studio 2010\\Projects\\AcuSapp\\AcuSapp\\bin\\debug\\AcuzioSecureStore DatabaseX.accdb"
您应该删除该部分:
Data Source=Provider=Microsoft.ACE.OLEDB.12.0;
尝试下面的连接字符串可能会有所帮助。
OleDbConnection LoginLink = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\SB18\\Documents\\Visual Studio 2010\\Projects\\AcuSapp\\AcuSapp\\bin\\debug\\AcuzioSecureStore DatabaseX.accdb");