c# - 将整数变量从另一种形式传递到 SQL 语句
问题描述
我正在与一个学校项目合作,我们应该在该项目中构建一个使用 SQL 数据库的简单预订系统。使用的语言是 C# 和环境 Visual Studio Community 2017。我正在尝试构建一个函数,用户从 dataGridView1 中选择一行并单击“添加新发票按钮”。booking_id 从 dataGridView1 中提取并传递给 Form2,在 Form2 中使用 booking_id 搜索与预订相关的数据。然后,此数据显示在 dataGridView2 中,其中列出了一个用户指定的预订中包含的所有服务。
数据库包含三个相关的表;预订、服务和 BoughServices。
Booking
包含列booking_id
(INT)Services
包含列service_id
(INT)、name
(VARCHAR) 和price
(INT)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
就像一个魅力。
有人可以帮助我并建议我应该如何格式化我的代码,以便我能够执行所需的操作吗?先感谢您!
解决方案
几乎是对的。唯一的问题是接收 sql 字符串的 SqlDataAdapter,而不是您定义参数的命令。只是改变
// Run SQL query
var dataAdapter = new SqlDataAdapter(command);
如您所见,有一个接收 SqlCommand的SqlDataAdapter 构造函数,您可以在其中定义参数并设置连接。
推荐阅读
- python - 使用 pach 标准化图像
- node.js - 过滤 fromdate 和 todate MongoDB
- python-3.x - 从完整的 xpath 生成 xml
- assemblyscript - Webassembly如何获取f64的指针或引用
- node.js - 如何解决 Heroku 上的部署“应用程序错误”?
- xml - 如何使 XML 元素与结束元素不同?
- react-native - 在 React-Native 中使用 Jest 测试模拟端点方法
- java - 如何在 ant 命令中传递空值,以便替换 build.xml 文件中的属性值
- typescript - 如何在 Typescript 中通过回调函数的参数类型声明类型?
- python - 实时多图的 Tkinter GUI