Как выполнить несколько операторов вставки в одном запросе? - PullRequest
0 голосов
/ 30 декабря 2018

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

Я попытался вставить другую таблицу в команду sql (показано ниже), и я попытался сделать другую команду sql, котораяв основном говорит то же самое с другим именем, но разделяет имя и номер телефона на первое и дату создания и дату получения во вторую, но при этом выполняется только первая команда sql, а затем она останавливается, поэтому данные никогда не сохраняются ввторой стол

private void AddPhBttn_Click(object sender, RoutedEventArgs e)
    {
        SqlConnection furniture = new SqlConnection("Data Source=LAPTOP-F4QFMPFD\\MSSQLSERVER1;Initial Catalog=Furniture;Integrated Security=True");



        furniture.Open();
        SqlCommand add = new SqlCommand("insert into Customers(Name, Phone) PriceHold(DateCreated, PickUpDate) values ('" + nameTxtBox.Text + "', '" + phoneTxtbox.Text + "', '" + dateTxtBox.Text + "', '" + puDateTxtBox.Text + "')", furniture);

        int i = add.ExecuteNonQuery();
        if (i != 0)
        {
            MessageBox.Show("saved");
        }
        else MessageBox.Show("error");
    }

Ответы [ 3 ]

0 голосов
/ 30 декабря 2018

При работе с данными в более чем одной таблице, если вы хотите, чтобы либо все успешно вставили / обновили / удалили завершено , либо ни один из них не был применен к вашим данным, чтобыцелостность данных, использование транзакций.Я думаю SqlTransaction это то, что вы ищете.Прочитайте об этом здесь .

Для вашего конкретного случая это одна из возможностей:

private void AddPhBttn_Click(object sender, RoutedEventArgs e)
{
    // Necessary input validation to collect and data from input fields. Good practice to avoid SQL injection.
    AddFurniture(nameTxtBox.Text, phoneTxtbox.Text, dateTxtBox.Text, puDateTxtBox.Text);
}

private void AddFurniture(string name, string phoneNumber, string createdDate, string pickupDate)
{
    string connectionString = "Data Source=LAPTOP-F4QFMPFD\\MSSQLSERVER1;Initial Catalog=Furniture;Integrated Security=True"; // This should ideally come from some configuration.
    using(SqlConnection connection = new SqlConnection(connectionString))
    {
        SqlCommand command = connection.CreateCommand();
        SqlTransaction transaction = connection.BeginTransaction("Add Furniture");
        command.Connection = connection;
        command.Transaction = transaction;

        try
        {
             connection.Open();
            command.CommandText = $"insert into Customers (Name, Phone) values ({name}, {phoneNumber});";
            command.ExecuteNonQuery();
            command.CommandText = $"insert into PriceHold (DateCreated, PickUpDate) values ({createdDate}, {pickupDate});";
            command.ExecuteNonQuery();

            // Try to commit to database.
            // Both the above queries are executed at this point. If any one of them fails, 'transaction' will throw an exception.
            transaction.Commit();
        }
        catch (Exception ex1)
        {
            // Considering the statements executed using the 'transaction' for this 'connection',
            // one of the insert operations have clearly failed.
            // Attempt to roll back the change which was applied.
            MessageBox.Show($"Insert failed. Trying to roll back {ex1.Message}");
            try
            {
                transaction.RollBack();
            }
            catch (Exception ex2)
            {
                // Rollback also failed. Possible data integrity issue. Handle it in your application.
                MessageBox.Show($"Roll back failed. {ex2.Message}");
            }
         }
     }
}
0 голосов
/ 30 декабря 2018

Как сказал @ Caius Jard , вы не можете сделать это с помощью специального запроса.

Итак, что можно сделать?

Шаг 1: Создать Stored Procedure в базе данных:

CREATE PROCEDURE usp_InsertData
@Name NVARCHAR(200),
@Phone NVARCHAR(100),
@DateCreated Date,
@PickUpDate Date
AS
BEGIN
    SET NOCOUNT ON;
    INSERT INTO Customers(Name, Phone) VALUES (@Name,@Phone)

    INSERT INTO PriceHold(DateCreated, PickUpDate) VALUES (@DateCreated,@PickUpDate) 
END

Шаг 2: Вызов выше Хранимая процедура в C # Код:

private void AddPhBttn_Click(object sender, RoutedEventArgs e)
{
     var furniture = new SqlConnection("Data Source=LAPTOP-F4QFMPFD\\MSSQLSERVER1;Initial Catalog=Furniture;Integrated Security=True");

     SqlCommand add = new SqlCommand("usp_InsertData", furniture);
     add.CommandType = System.Data.CommandType.StoredProcedure;

     add.Parameters.AddWithValue("@Name", nameTxtBox.Text);
     add.Parameters.AddWithValue("@Phone", phoneTxtbox.Text);
     add.Parameters.AddWithValue("@DateCreated", dateTxtBox.Text);
     add.Parameters.AddWithValue("@PickUpDate", puDateTxtBox.Text);
     furniture.Open();

     int i = add.ExecuteNonQuery();

     if (i != 0)
     {
          MessageBox.Show("saved");
     }
     else
     {
         MessageBox.Show("error");
     }
     furniture.Dispose();

}
0 голосов
/ 30 декабря 2018

Вы не можете сделать это в SQL

INSERT INTO 
  myfirsttable(column1, column2)
  mysecondtable(column3, column4, column5)
VALUES(value1, value2, value3, value4)

Это синтаксическая ошибка.Только одна таблица может появиться во вставке.Количество вставленных значений должно соответствовать количеству столбцов

Если вы хотите вставить в две таблицы, запустите две отдельные вставки из вашего кода c #

Наконец, долго читайте http://bobby -tables.com - ваш код в настоящее время крайне небезопасен, и хотя сейчас это может не иметь значения, потому что это всего лишь небольшое тестовое приложение, лучше избегать пути обучения, который включает в себя кодирование таким образом.Как рекрутер, я отказался от многих кандидатов на работу, которые написали такой SQL-код, и я бы никогда не нанял кого-нибудь, кто продемонстрировал бы мне этот стиль

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