繁体   English   中英

从C#中的数据表中检索数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM