如何通过单个连接运行两个SQL命令?

问题描述 投票:0回答:2

我需要在一个表中插入数据并使用添加按钮更新第二个表中的ID:

private void addButton_Click(object sender, EventArgs e)
{
    con.Open();
    cmd = new SqlCommand("Insert Into Rent(toolId, customerId, custName, Fee, date, dueDate) Values('" + toolIdComboBx.Text + "', '" + custIdTxtBx.Text + "', '" + custNameTxtBx.Text + "', '" + feeTxtBx.Text + "', '" + dateTimePicker2.Text + "', '" + dateTimePicker1.Text + "')", con);

    dr = cmd.ExecuteReader();

    if (dr.Read())
    {
        con.Close();
        con.Open();

        cmd = new SqlCommand("Update Inventory Set Available = 'No' Where ToolId =  = '" + toolIdComboBx.Text + "' ");

        cmd.ExecuteNonQuery();
    }

    con.Close();
    DisplayData();
}
c# sql-server sqlconnection sqlcommand
2个回答
1
投票

如果连接为打开的SqlDataReader,则无法关闭连接。

您为什么从INSERT语句中读取?您期望什么?

也请使用参数化查询。


0
投票

我可以在这里看到一些问题

  1. 始终总是使用参数化查询(@ broots-waymb的属性),并且永远不要将用户输入连接到SQL命令中
  2. 使用using关键字通过Dispose()方法自动清理任何对象,该方法包括SqlConnection和SqlCommand-这样可以确保在出现异常时进行适当的清理;也更容易正确编写]
  3. 如果不希望返回记录集,请使用ExecuteNonQuery()。正如@jdweng指出的,唯一返回记录集的查询是SELECT语句(存储过程也可能)。 Read()的含义是这段代码不清楚,我的猜测是它将始终返回false
  4. 当数据库模式包含一个表(清单)的状态取决于另一表(出租)的状态时,请当心。考虑避免这种情况的策略,但如果不能避免,则应考虑将更新包装到数据库事务中的两个表中,以确保系统状态一致。
© www.soinside.com 2019 - 2024. All rights reserved.