我有一个包含三列的数据:用户名密码和名称。 我有一个登录屏幕,检查检查用户名和密码是否允许访问。我试图将用户的名称显示在另一个表单上,但我所拥有的不起作用。
程序运行直到我按下登录,然后显示IndexOutOfRangeException。我觉得我没有调用数据所在的正确单元格,但我无法弄明白。我对数据表很新。
登录表格:
AWSCredentialsProviderChain myCustomChain = new AWSCredentialsProviderChain(new InstanceProfileCredentialsProvider());
MainGuiView:
namespace Inventory_Program
{
public partial class Login : Form
{
public string name;
public Login()
{
InitializeComponent();
}
/*
* Used when user accepts to login. username and password must be correct or error message will display
* Using a table in sql form.
*/
private void loginButton_Click(object sender, EventArgs e)
{
SqlConnection connection = new SqlConnection(@"Data Source = (LocalDB)\MSSQLLocalDB; AttachDbFilename = C:\Users\brand\Documents\Data.mdf; Integrated Security = True;");
SqlDataAdapter adapter = new SqlDataAdapter("Select Count(*) From Login where Username='" + usernameTextfield.Text + "' and Password = '" + passwordTextfield.Text + "'", connection);
DataTable dt = new DataTable();
adapter.Fill(dt);
if (dt.Rows[0][0].ToString() == "1")
{
name = dt.Rows[0][3].ToString();
this.Hide();
MainGUIPanel mainview = new MainGUIPanel();
mainview.Show();
}
else
{
MessageBox.Show("Username or Password Incorrect! Try Again!");
}
} //end of login button
//can canel out of login in screen, closes window.
private void cancelButton_Click(object sender, EventArgs e)
{
this.Close();
} //end of cancel button
public string getName()
{
return name;
}
}
}
答案 0 :(得分:0)
Select Count(*) From Login where Username='" + usernameTextfield.Text + "' and Password = '" + passwordTextfield.Text + "'"
在适配器中只放置一个项目:其中只有一个数字的表格(来自dt.Rows [0] [0]的Count(*)。
你会想要这样的东西:
Select UserName From Login where Username='" + usernameTextfield.Text + "' and Password = '" + passwordTextfield.Text + "'"
见下文!这非常容易受到所有黑客的攻击!
和
name = dt.Rows[0][0].ToString();
提醒一句,这很重要:我真的鼓励你查找sql server注入攻击。您的代码非常容易受此影响。只需在用户名或密码字段中键入一些代码,经验丰富的程序员就可以登录您的应用程序或在没有凭据的情况下清除数据库。
答案 1 :(得分:0)
错误位于:name = dt.Rows [0] [3] .ToString();.
您选择:count(*),仅返回 1column。
您需要选择要显示的列。 你不需要计算结果,因为你的where子句应该选择不同的结果。而是检查数据表rows.count是否大于1.