[英]Retrieving data from a Datatable in C#
我有一个包含三列的数据功能:用户名密码和名称。 我有一个登录屏幕,该屏幕检查是否检查用户名和密码是否允许访问。 我正在尝试在另一个表单上显示用户名,但是我无法使用。
该程序一直运行到我按登录键,然后显示IndexOutOfRangeException为止。 我觉得我没有调用数据所在的正确单元格,但无法弄清楚。 我对数据表很陌生。
登录表单:
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;
}
}
}
MainGuiView:
namespace Inventory_Program
{
public partial class MainGUIPanel : Form
{
Login login = new Login();
public MainGUIPanel()
{
InitializeComponent();
//runs the current time and data
currentTime.Start();
}
//Method is adding a horizontal line to the top panel
private void topControlPanel_Paint(object sender, PaintEventArgs e)
{
Graphics graphics = e.Graphics;
Pen pen = new Pen(Color.Black, 1);
graphics.DrawLine(pen, 1091, 93, 00, 93);
graphics.Dispose();
nameLabel.Text = login.getName();
}
//allows for the current time and date to be displayed in the top panel
private void currentTime_Tick(object sender, EventArgs e)
{
DateTime dateTime = DateTime.Now;
}
private void inventoryButton_Click(object sender, EventArgs e)
{
}
}
}
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服务器注入攻击。 您的代码很容易受到此攻击。 经验不足的程序员只需在用户名或密码字段中键入一些代码,即可登录您的应用程序或在没有凭据的情况下清除数据库。
该错误位于:name = dt.Rows [0] [3] .ToString();。
您选择:count(*),仅返回1列。
您需要选择要显示的列。 您无需计算结果,因为where子句应选择不同的结果。 相反,请检查数据表的rows.count是否大于1。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.