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

时间:2011-05-09 01:01:10

标签: c# asp.net sql-server visual-studio

我正在建立一个训练练习项目,我的处理程序禁止参数化,我更倾向于关注其他事情。他指示我使用以下类型的字符串来插入。我知道这不安全。它不适合实际部署。但是,我处于绑定状态,因为在对数据库进行必要的重构之后,我需要重新编写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 + "')";

3 个答案:

答案 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