我正在建立一个训练练习项目,我的处理程序禁止参数化,我更倾向于关注其他事情。他指示我使用以下类型的字符串来插入。我知道这不安全。它不适合实际部署。但是,我处于绑定状态,因为在对数据库进行必要的重构之后,我需要重新编写insert和select命令。 My Submission表有一个自动递增的SubmissionId列,我需要将该值插入Broker和Customer表的SubId列。我该怎么做呢?
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 + "')";
答案 0 :(得分:1)
查看DbCommand/SqlCommand.ExecuteScalar()
执行您的第一个查询。
var id = cmd.ExecuteScalar(idQuery)
将获取上次插入的自动ID行的ID。
我认为您可以使用您获得的值来替换所有*whatgoeshere?*
SqlCommand msdn page有一个很好的例子,你可以参考。
答案 1 :(得分:0)
您可能希望首先运行此代码:
SET IDENTITY_INSERT Customer ON;
然后您可以运行INSERT语句。完成后,运行以下语句:
SET IDENTITY_INSERT Customer OFF;
答案 2 :(得分:0)
首先,如果可以的话,我可能会把它变成一个存储过程。如果你将所有这些都放入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