Как выполнить 2 оператора Sql одним нажатием кнопки - PullRequest
0 голосов
/ 13 сентября 2011

Мне удалось выполнить этот запрос, используя wamp.

INSERT INTO guest (guestno,familyname)
    VALUES(NULL,'Damn');      

INSERT INTO reservation (reservationno, guestno)
    VALUES(NUll,LAST_INSERT_ID())

Однако, если я выполню эти два оператора вставки по отдельности, у меня будет ограничение внешнего ключа.Я думаю, что оба они должны быть выполнены одновременно.

Мои вопросы:

  1. Как включить это в мой код winform c #?
  2. Можно ли иметь 2 оператора вставки на одну кнопку?

Когда пользователь нажимает «добавить резервирование», я бы хотел, чтобы два запроса MySQl были выполнены.

Вот мой оператор вставки:

private void button7_Click(object sender, EventArgs e)
        {
    string connectionString =
            "Server=localhost;" +
        "Database=sad;" +
        "User ID=root;" +
        "Password=root;" +
        "Pooling=false";

        IDbConnection dbcon;
        dbcon = new MySqlConnection(connectionString);
        dbcon.Open();

        IDbCommand dbcmd = dbcon.CreateCommand();
        string sql = "<insert statement>";
        dbcmd.CommandText = sql;
        IDataReader reader = dbcmd.ExecuteReader();
        reader.Read(); 

}

ОБНОВЛЕННАЯ ВЕРСИЯ (НЕ РАБОТАЕТ)

string connectionString =
         "Server=localhost;" +
         "Database=sad;" +
     "User ID=root;" +
     "Password=root;" +
     "Pooling=false";
    Form3 f3 = new Form3();

        IDbConnection dbcon;
        dbcon = new MySqlConnection(connectionString);
        dbcon.Open();
        IDbCommand dbcmd = dbcon.CreateCommand();
        string sql = "insert into guest (guestno, familyname) values (null, '" + textBox6.Text + "'); insert into reservation (reservationno, guestno) values (null, LAST_INSERT_ID())";
        dbcmd.CommandText = sql;

        IDataReader reader = dbcmd.ExecuteReader();
        reader.Read();
        MessageBox.Show("Added Guest Reservation Successfully");
        f3.guestList();
        f3.reservationList();

Обновлен № 3 (ЕЩЕ НЕ РАБОТАЕТ)

string connectionString =
             "Server=localhost;" +
             "Database=sad;" +
             "User ID=root;" +
             "Password=root;" +
             "Pooling=false";

            IDbConnection dbcon;
            dbcon = new MySqlConnection(connectionString);
            dbcon.Open();
            IDbCommand dbcmd = dbcon.CreateCommand();
            dbcmd = new MySqlCommand("CreateGuestAndReservation", dbcon);
            dbcmd.CommandType = CommandType.StoredProcedure;
            dbcmd.Parameters.AddWithValue("familyName", "foo");
            dbcmd.ExecuteNonQuery();
enter code here

Ответы [ 4 ]

1 голос
/ 13 сентября 2011

Вы не можете выполнить более одного оператора для данного MySqlCommand.

Ваша лучшая ставка (ремонтопригодность, производительность, удобочитаемость):

  • создайте хранимую процедуру MySQL для ваших 2 операторов SQL.
  • вызовите ваш сохраненный процесс, используя ExecuteNonQuery().
DELIMITER //
CREATE PROCEDURE CreateGuestAndReservation
(
   IN familyName VARCHAR(255)
)
BEGIN
    insert into guest (guestno, familyname) 
     values (null, familyName); 

    insert into reservation (reservationno, guestno) 
    values (null, LAST_INSERT_ID());

END//
DELIMITER ;

Назовите его из своего кода WinForms следующим образом:

dbcon.Open();
cmd = new MySqlCommand("CreateGuestAndReservation", dbcon);
cmd.CommandType = CommandType.StoredProcedure;
//cmd.Parameters.AddWithValue("?familyName", "foo");
cmd.Parameters.Add("?familyName", MySqlDbType.VarChar,255).Value = "foo";
cmd.ExecuteNonQuery();
0 голосов
/ 26 февраля 2013

Попробуйте, это будет работать:

    private void button56_Click(object sender, EventArgs e) {
        con.Open();
        SqlCommand cmd = new SqlCommand("insert into stholidays values('" + dateTimePicker12.Text + "','" + dateTimePicker20.Text + "','" + dateTimePicker13.Text + "','" + mbk + "','" + dateTimePicker14.Text + "','" + dateTimePicker15.Text + "','" + lt + "','" + dateTimePicker16.Text + "','" + dateTimePicker17.Text + "','" + ebk + "','" + dateTimePicker18.Text + "','" + dateTimePicker19.Text + "','" + textBox105.Text + "','" + textBox106.Text + "','" + textBox107.Text + "','" + dd + "','" + textBox104.Text + "')", con);
        SqlCommand cmd1 = new SqlCommand("insert into holidays values('" + dd + "','" + ms + "','" + day + "','" + textBox104.Text + "')", con);
        cmd.ExecuteNonQuery();
        cmd1.ExecuteNonQuery();
        con.Close();    
    }
0 голосов
/ 13 сентября 2011

Я бы посоветовал иметь способ получить идентификаторы, отличные от автоматического генерирования идентификаторов, такие как автоинкременты сервера mysql и sql, которые очень ограничены.Если вы используете генератор идентификаторов HILO, вы сначала получаете идентификатор, а затем выполняете несколько вставок в одной транзакции без проблем, поскольку вы заранее знаете свой родительский идентификатор.

Это не решит вашу непосредственную проблему, но в будущем оно очень поможет с вашим приложением, особенно если хранение данных типа «родители-дети», таких как данные, будет происходить часто.

0 голосов
/ 13 сентября 2011

Код ниже должен работать, но я подозреваю, что вы, возможно, уже пробовали его, учитывая, что вы просите о помощи?

string sql = "INSERT INTO guest (guestno,familyname) VALUES(NULL,'Damn'); INSERT INTO reservation (reservationno, guestno) VALUES(NUll,LAST_INSERT_ID())";

Если вам нужны параметры, попробуйте это:

string sql = "INSERT INTO guest (guestno,familyname) VALUES(NULL,?familyName); INSERT INTO reservation (reservationno, guestno) VALUES(NUll,LAST_INSERT_ID())";
...
dbcmd.Parameters.Add("@familyName", MySqlDbType.VarChar, 80).Value = _familyName;

РЕДАКТИРОВАТЬ: Вам может потребоваться выполнить 2 команды вставки. Смотри здесь .

...