Chun Kit Ответов: 2

Как получить данные txtusername.text из SQL-запроса windows form 1(frmlogin) в форму 2(frmmain)


Уважаемый Эксперт,


Я сталкиваюсь с ошибкой, когда хочу передать свои данные, которые вставляются в SQL-запрос Form1(frmLogin) в Form2(frmMain).

Кодировка Form1(frmLogin)

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.SqlClient;

namespace SytelineAutoGenerateDocNum
{
    public partial class frmLogin : Form
    {
        public frmLogin()
        {
            InitializeComponent();
        }

        private void btnLogin_Click(object sender, EventArgs e)
        {
            SqlConnection sqlcon = new SqlConnection(@"Data Source=P13L3CFN756\SQLEXPRESS;Initial Catalog=Syteline_Misc_DocNum;Persist Security Info=True;User ID=sa;Password=1234;");
            string query = "SELECT *FROM [Syteline_Misc_DocNum].[dbo].[users] Where username = '" + txtUsername.Text.Trim() + "' and password = '" + txtPassword.Text.Trim() + "'";
            SqlDataAdapter sda = new SqlDataAdapter(query, sqlcon);
            DataTable dtbl = new DataTable();
            sda.Fill(dtbl);


            if (dtbl.Rows.Count == 1)
            {
                frmMain objFrmMain = new frmMain();
                
                //objFrmMain.Value = txtUsername.Text;
               //objFrmMain.ShowDialog();
                objFrmMain.Show();
                this.Hide();
            }
            else
            {
                MessageBox.Show("Check your username and password");
            }
            
        }

        private void btnExit_Click(object sender, EventArgs e)
        {
            this.Close();
        }

    }
}


Кодирование Form2(frmMain)

private void buttonGDN_Click(object sender, EventArgs e)
       {
           con.Open();
           SqlCommand cmd = new SqlCommand("Insert into DocNum (Date,UserID,BusinessUnit,RunningNumber,DocumentNumber)values('" + txtUsername.Text + "')");
       }


Моя ошибка заключается в следующем (имя "txtUsername" не существует в текущем контексте).

Ценю вашу помощь. Спасибо

Что я уже пробовал:

Я понятия не имею об ошибке. и я попытался включить конфигурацию системы по ссылке. Но и решить проблему не смог.

Richard Deeming

В дополнение к этому SQL-инъекция[^] уязвимость в вашем коде, вы также храните пароли в виде обычного текста. Не делай этого.

Безопасная Аутентификация Паролем Объясняется Просто[^]
Соленое хэширование паролей - делаем это правильно[^]

2 Ответов

Рейтинг:
2

DerekT-P

По умолчанию одна форма не имеет доступа к элементам управления в другой форме. Вы начали решать эту проблему с помощью своего кода

//objFrmMain.Value = txtUsername.Text
но вы это прокомментировали. Вместо ссылки на мыши frmmain по .Value property, вы можете создать общедоступную переменную или свойство frmMain и установить его в этой точке; затем ссылаться на него в событии buttonGDN_Click frmMain.
Альтернативным методом было бы квалифицировать вашу ссылку на txtUsername, когда вы ссылаетесь на нее; однако вам нужно будет найти правильную форму, чтобы получить ссылку на нее. (Предположим, что была какая-то ситуация, когда был вызван buttonGDN_Click, но frmLogin больше не был открыт или было несколько его экземпляров). Это было бы относительно сложно, и вам все равно пришлось бы иметь дело со случаями, когда форма не была открыта или было несколько экземпляров (в вашем приложении это может быть безопасным предположением, что всегда будет открыт один экземпляр frmLogin, но Я не могу этого предположить, и это может измениться в будущем).
Поэтому лучше всего создать либо общедоступное свойство frmMain, либо общедоступную переменную:
public string Username = string.Empty;
Тогда ваш код открытия frmMain становится
frmMain objFrmMain = new frmMain();                
objFrmMain.Username = txtUsername.Text;
objFrmMain.Show();
Наконец, как это часто бывает, ваше приложение широко открыто для атаки SQL-инъекции (или просто случайной ошибки / повреждения) в результате простой подкладки переменных формы при построении SQL для проверки имени пользователя. Любой, кто вводит один Апостроф в свое имя пользователя, либо ломает ваш код, либо врывается в вашу базу данных. Всегда параметризуйте любой SQL-запрос, содержащий введенный пользователем текст.


Рейтинг:
0

OriginalGriff

Как именно, зависит от "отношения" между этими двумя формами.
Взгляните на них, один из них будет соответствовать вашим обстоятельствам.
Форма, которая создает экземпляр другого:

MyForm mf = new MyForm();
mf.Show();
Это "родитель", другая форма - "Ребенок".
(Это не подразумевает никаких формальных отношений MDI)

Передача информации между двумя формами, Часть 1: Родитель-Ребенок[^]
Передача информации между двумя формами, Часть 2: Ребенок-Родитель[^]
Передача информации между двумя формами, Часть 3: Ребенок ребенку[^]
Вам нужна часть 2.