Передача целочисленных переменных в оператор SQL из другой формы - PullRequest
0 голосов
/ 11 мая 2018

Я работаю со школьным проектом, где мы должны создать простую систему бронирования, которая использует базу данных SQL.Используемый язык - C # и среда Visual Studio Community 2017. Я пытаюсь создать функцию, в которой пользователь выбирает строку из dataGridView1 и нажимает кнопку «Добавить кнопку нового счета».Параметр booking_id извлекается из dataGridView1 и передается в форму Form2, где данные, связанные с бронированием, ищутся с помощью booking_id.Эти данные затем представляются в dataGridView2, в котором перечислены все услуги, включенные в одно указанное пользователем бронирование.

База данных содержит три соответствующие таблицы;Booking, Service и BoughServices.

  1. Booking содержит столбец booking_id (INT)
  2. Services содержит столбцы service_id (INT), name (VARCHAR)и price (INT)
  3. BoughtServices, содержит столбцы Booking.booking_id (INT), Service.service_id (INT) и amount (INT)

Код включенФорма 1:

// Establish a class for data.
public static class DataToForm2
{
    public static int booking_id;
}

// User clicks button 'Add new invoice'.
private void button_CreateInvoice_Click(object sender, EventArgs e)
{
    Form2 f2 = new Form2();

    //Note: CurrentRow.Cells[0] contains booking_id.
    DataToForm2.booking_id = Convert.ToInt32(dataGridView1.CurrentRow.Cells[0].Value);
    f2.Show();
}

Код формы 2:

private void Form2_Load(object sender, EventArgs e)
{
    using(SqlConnection connection = new SqlConnection(connectionString))
    {
        // Set SQL query string.
        string query = "SELECT Service.name, Services.price, BoughtServices.amount " +
            "FROM Service " +
                "INNER JOIN Service.service_id ON BoughtServices.service_id " +
                "INNER JOIN Bookings ON Bookings.booking_id = BoughtServices.booking_id " +
            "WHERE " +
                "Booking.booking_id = @booking_id";  

        SqlCommand command = new SqlCommand(query, connection);

        // Set query parameters.
        command.Parameters.Add("@booking_id", SqlDbType.Int).Value = Form1.DataToForm2.booking_id;

        // Run SQL query
        var dataAdapter = new SqlDataAdapter(query, connection);
        DataSet ds = new DataSet();
        dataAdapter.Fill(ds);
        dataGridView1.ReadOnly = true;
        dataGridView2.DataSource = ds.Tables[0];
    }
}

Однако этот подход не работает и выдает ошибку System.Data.SqlClient.SqlException: Must declare the scalar variable "@booking_id.Я потратил все больше часов, чтобы понять это и найти решение из учебников, но пока что все они провалились.Интересно, что все работает очень хорошо, когда я добавляю booking_id непосредственно в оператор SQL.Другими словами, WHERE Booking.booking_id = 2 работает как талисман.

Может ли кто-нибудь мне помочь и предложить, как мне отформатировать код, чтобы я мог выполнять желаемые действия?Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Почти верно. Единственная проблема - SqlDataAdapter, который получает строку sql, а не команду, в которой вы определили параметр. Просто поменяй

// Run SQL query
var dataAdapter = new SqlDataAdapter(command);

Как вы можете видеть, есть конструктор SqlDataAdapter , который получает SqlCommand, где вы можете определить параметры и установить соединение.

0 голосов
/ 11 мая 2018

Вы неправильно используете параметризованный SQL-запрос.Он функционирует больше как string.Replace, чем присваивание.Попробуйте

command.Parameters.Add("@booking_id", 
Form1.DataToForm2.booking_id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...