【问题标题】:Insert auto incremented value into another table's column?将自动递增值插入另一个表的列?
【发布时间】:2011-05-09 01:01:10
【问题描述】:

我正在构建一个用于训练的练习项目,但我的处理程序禁止我进行参数化,我宁愿现在专注于其他事情。他指示我使用以下类型的字符串插入。我知道这不安全。它不适用于实际部署。然而,我陷入了困境,因为在对数据库进行了一些必要的重组之后,我需要重新编写插入和选择命令。我的 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 + "')";

【问题讨论】:

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


    【解决方案1】:

    查看 DbCommand/SqlCommand.ExecuteScalar() 以执行您的第一个查询。

    var id = cmd.ExecuteScalar(idQuery)
    

    将为您获取最后插入的自动 id 行的 id。

    我认为你可以用你取回的值来替换所有*whatgoeshere?*

    SqlCommand msdn page 有一个很好的例子,你可以参考一下。

    【讨论】:

      【解决方案2】:

      您可能希望先运行此代码:

      SET IDENTITY_INSERT Customer ON;
      

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

      SET IDENTITY_INSERT Customer OFF;
      

      【讨论】:

      • 我认为 OP 希望使用刚刚插入的自动递增 ID,而不是插入到该表中。
      【解决方案3】:

      首先,如果可以的话,我可能会把它变成一个存储过程。如果您将所有这些都放入一个SP中。然后你可以从最后插入的提交表中获取 subID:

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-22
        • 2011-08-23
        相关资源
        最近更新 更多