C # MySQL Вставка одних и тех же данных в 2 разные таблицы - PullRequest
0 голосов
/ 17 марта 2019

Итак, я попытался создать код для добавления двух одинаковых данных в две разные таблицы, такие как "studentinfo" и "logindb". Я попытался сделать это

enter code heprivate void buttonRegisterStudent_Click(object sender, EventArgs e)
    {
        String connection = "server=localhost;user id=root;password=root;persistsecurityinfo=True;database=votingdb";
        //Inserting Data
        String insertDataInfo = @"INSERT INTO studentinfo (firstname,lastname,username,password,email) values 
                                   ('"+this.textBoxFirstName.Text+"','"+this.textBoxLastName.Text+"','"+this.textBoxUsername.Text+
                                   "','"+ this.textBoxPassword.Text + "','"+ this.textBoxEmail.Text + "')";
        String insertDataLogin = @"INSERT INTO logindb (username,password) values ('"+this.textBoxUsername.Text+"','"
                                    +this.textBoxPassword.Text+"')";
        //Connection
        MySqlConnection con = new MySqlConnection(connection);
        MySqlCommand datainfo = new MySqlCommand(insertDataInfo,con);
        MySqlCommand datalogin = new MySqlCommand(insertDataLogin, con);
        MySqlDataReader datareaderinfo;
        MySqlDataReader datareaderlogin;

        try
        {
            con.Open();
            datareaderinfo = datainfo.ExecuteReader();
            datareaderlogin = datalogin.ExecuteReader();
            MessageBox.Show("Student Register Successfully!");
        }

        catch (Exception ex)
        {
            MessageBox.Show("Failed to Register" + ex);
        }

    }

В результате ошибки, которая говорит, что может быть только один mysqldatareaderв коде.Как добавить одни и те же данные в разные таблицы?

Ответы [ 2 ]

0 голосов
/ 17 марта 2019

Вам не нужен считыватель данных для операторов вставки, вы должны просто использовать ExecuteNonQuery.
Обратите внимание, что ваши текущие запросы представляют собой угрозу безопасности, поскольку они уязвимы для атак SQL-инъекция . Вместо объединения пользовательских входных данных в виде строк для создания операторов SQL используйте параметризованные запросы.
Для получения дополнительной информации читайте Как подготовленные операторы могут защитить от атак SQL-инъекций?

Улучшенная версия основных частей в вашем коде:

var insertDataInfo = @"INSERT INTO studentinfo (firstname,lastname,username,password,email) values 
                            (@firstName, @lastName, @userName, @passwordHash, @email)";                 

var insertDataLogin = @"INSERT INTO logindb (username,password) values (@userName, @passwordHash)";

var datainfo = new MySqlCommand(insertDataInfo,con);
datainfo.Parameters.Add("@firstName", DbType.VarChar).Value = this.textBoxFirstName.Text;
datainfo.Parameters.Add("@lastName", DbType.VarChar).Value = this.textBoxLastName.Text;
datainfo.Parameters.Add("@userName", DbType.VarChar).Value = this.textBoxUsername.Text;
datainfo.Parameters.Add("@passwordHash", DbType.VarChar).Value = this.textBoxPassword.Text;
datainfo.Parameters.Add("@email", DbType.VarChar).Value = this.textBoxEmail.Text;

var datalogin = new MySqlCommand(insertDataLogin, con);
datalogin.Parameters.Add("@userName", DbType.VarChar).Value = this.textBoxUsername.Text;
datalogin.Parameters.Add("@passwordHash", DbType.VarChar).Value = this.textBoxPassword.Text;

datainfo.ExecuteNonQuery();
datalogin.ExecuteNonQuery();

Кроме того, вы храните пароли в виде простого текста в вашей базе данных.
Это действительно большая дыра в безопасности. Вместо этого вы должны хранить соленые хеш-значения ваших паролей - но этот ответ становится слишком широким для этого ответа, поэтому я оставлю эту часть для вас, чтобы вы могли ее прочитать и применить.

0 голосов
/ 17 марта 2019

Не используйте устройство чтения данных, если вы не хотите читать данные. Просто используйте ExecuteNonQuery в вашей команде:

datainfo.ExecuteNonQuery();

И не забудьте открыть и закрыть ваше соединение!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...