首页 > 解决方案 > 将整数变量从另一种形式传递到 SQL 语句

问题描述

我正在与一个学校项目合作,我们应该在该项目中构建一个使用 SQL 数据库的简单预订系统。使用的语言是 C# 和环境 Visual Studio Community 2017。我正在尝试构建一个函数,用户从 dataGridView1 中选择一行并单击“添加新发票按钮”。booking_id 从 dataGridView1 中提取并传递给 Form2,在 Form2 中使用 booking_id 搜索与预订相关的数据。然后,此数据显示在 dataGridView2 中,其中列出了一个用户指定的预订中包含的所有服务。

数据库包含三个相关的表;预订、服务和 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)

Form1上的代码:

// 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();
}

Form2上的代码:

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就像一个魅力。

有人可以帮助我并建议我应该如何格式化我的代码,以便我能够执行所需的操作吗?先感谢您!

标签: c#sqlwinforms

解决方案


几乎是对的。唯一的问题是接收 sql 字符串的 SqlDataAdapter,而不是您定义参数的命令。只是改变

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

如您所见,有一个接收 SqlCommand的SqlDataAdapter 构造函数,您可以在其中定义参数并设置连接。


推荐阅读