将自动递增的值插入到另一个表的列中

本文关键字:另一个 插入 | 更新日期: 2023-09-27 17:55:43

我正在构建一个用于训练的练习项目,我的处理程序禁止我参数化,宁愿我现在专注于其他事情。他指示我使用以下类型的字符串来插入。我知道这不安全。它不适用于实际部署。但是,我陷入了困境,因为在对数据库进行一些必要的重组后,我需要重新编写插入和选择命令。我的提交表有一个自动递增的提交 ID 列,我需要将该值插入到我的经纪人和客户表的子 ID 列中。我该怎么做?

string idQuery = "SELECT SCOPE_IDENTITY() AS LastInsertedSubmissionId";
String custQuery = "INSERT INTO Customer 
                      (CustId, CustName, SicNaic, CustAdd, CustCity, CustState, CustZip, SubId)           
                    VALUES
                      ('" + TbCustId.Text + "', '" + TbCustName.Text + "', '" + RblSicNaic.SelectedItem + "', '" + TbCustAddress.Text + "', '" + TbCustCity.Text + "', '" + DdlCustState.SelectedItem + "', '" + TbCustZip.Text + "', *whatgoeshere?*)";
String broQuery = "INSERT INTO Broker 
                     (BroId, BroName, BroAdd, BroCity, BroState, BroZip, EntityType, SubId) 
                   VALUES 
                     ('" + TbBroId.Text + "', '" + TbBroName.Text + "', '" + TbBroAddress.Text + "', '" + TbBroCity.Text + "', '" + DdlBroState.SelectedItem + "', '" + TbBroZip.Text + "', '" + DdlEntity.SelectedItem + "', *whatgoeshere?*)";
String subQuery = "INSERT INTO Submission 
                     (Coverage, CurrentCoverage, PrimEx, Retention, EffectiveDate, Commission, Premium, Comments) 
                   VALUES 
                     ('" + TbCoverage.Text + "','" + TbCurrentCoverage.Text + "','" + TbPrimEx.Text + "','" + TbRetention.Text + "','" + TbEffectiveDate.Text + "','" + TbCommission.Text + "','" + TbPremium.Text + "','" + TbComments.Text + "')";

将自动递增的值插入到另一个表的列中

查看执行

第一个查询的DbCommand/SqlCommand.ExecuteScalar()

var id = cmd.ExecuteScalar(idQuery)

将为您提供上次插入的自动 ID 行的 ID。

我认为您可以使用返回的值来替换所有*whatgoeshere?*

SqlCommand msdn 页面有一个很好的示例,您可以参考。

您需要先运行此代码:

SET IDENTITY_INSERT Customer ON;

然后,您可以运行 INSERT 语句。 完成后,运行以下语句:

SET IDENTITY_INSERT Customer OFF;

首先,如果可以的话,我可能会将其制作成存储过程。如果将所有这些放入 SP 中。然后你可以从上次插入的提交表中获取子 ID:


declare @subID int
set @subID = (SELECT SCOPE_IDENTITY() AS LastInsertedSubmissionId)

现在,您可以在后续查询中使用@subID。

如果你不能把它做成一个SP,那么你需要先执行idQuery(使用SqlCommand.ExecuteScalar()),然后获取结果并将其保存到你的代码变量中,然后在后续查询中使用它。


var subID = cmd.ExecuteScalar(idQuery) 

我之所以说将所有内容都放在 SP 中是因为它更容易维护,我认为从您的代码来看,您应该对整个事情进行传输 - 您不希望客户查询工作,然后代理查询失败,对吗?您将失去数据完整性,因为现在您的客户表中将有一行额外的行。

您也可以从代码中使用数据库事务,但它稍微复杂一些:http://www.knowdotnet.com/articles/transactions.html