C# 如何获取最后一个最大记录ID、增量ID,然后将记录添加到表C应用程序中

C# 如何获取最后一个最大记录ID、增量ID,然后将记录添加到表C应用程序中,c#,sql,sql-server-2008,C#,Sql,Sql Server 2008,以下代码将新记录输入表中。然而,由于某种原因,它正在接收3126,并且该ID的记录已经存在。每次运行此函数时,它都会递增1,但在3198之前,id已经有了相应的值。我将如何更改以及进行哪些更改,以便它获得记录中已存在的最大值,并将ID增加1,然后添加记录 SqlConnection conn = new SqlConnection(Properties.Settings.Default.ConnectionString); try { conn.Open(); SqlComma

以下代码将新记录输入表中。然而,由于某种原因,它正在接收3126,并且该ID的记录已经存在。每次运行此函数时,它都会递增1,但在3198之前,id已经有了相应的值。我将如何更改以及进行哪些更改,以便它获得记录中已存在的最大值,并将ID增加1,然后添加记录

SqlConnection conn = new SqlConnection(Properties.Settings.Default.ConnectionString);
try
{
    conn.Open();

    SqlCommand sqlCMD = new SqlCommand("InsertNewDeal", conn);

    sqlCMD.CommandType = System.Data.CommandType.StoredProcedure;
    sqlCMD.Parameters.Add("@Title", System.Data.SqlDbType.VarChar, 100);
    sqlCMD.Parameters.Add("@Office", System.Data.SqlDbType.Char, 3);
    sqlCMD.Parameters.Add("@EntryBy", System.Data.SqlDbType.VarChar, 50);
    sqlCMD.Parameters.Add("@CSR1", System.Data.SqlDbType.VarChar, 50);
    sqlCMD.Parameters.Add("@id", System.Data.SqlDbType.Int);
    sqlCMD.Parameters["@id"].Direction = System.Data.ParameterDirection.Output;


    sqlCMD.Parameters["@Title"].Value = txtName.Text;
    sqlCMD.Parameters["@Office"].Value = cmbOffice.SelectedValue;
    sqlCMD.Parameters["@CSR1"].Value = cmbCSR.SelectedValue;
    sqlCMD.Parameters["@EntryBy"].Value = LisaDatabaseManager.CurrentCSR.Username;

    CSR user = CSR.LoadCurrentUser();
    sqlCMD.ExecuteNonQuery();
    this.newProductionID = (int)sqlCMD.Parameters["@id"].Value;


    SqlCommand cmd = new SqlCommand("UPDATE Productions SET CountryCode = 'CAN', ProvinceCode = '" + user.GetProvinceCode() + "' WHERE ID = " + newProductionID, conn);
    cmd.ExecuteNonQuery();

    AddOptionalFields(newProductionID);

    LisaDatabaseManager.DealsTable.Fill(LisaDatabaseManager.DSGlobal.LoadDeals);
    DialogResult = DialogResult.OK;
    Close();
}
catch (Exception ex)
{
    ExceptionHandler.LogException("New deal", ex, LogSource.CHECK);
}
finally
{
    conn.Close();
}
}
}
InsertNewdeal的存储过程如下所示:

ALTER PROCEDURE [dbo].[InsertNewDeal]
    @Title varchar(100),
    @EntryBy varchar(50),
    @Office char(3),
    @CSR1 varchar(50),
    @id int OUTPUT
AS
BEGIN
    SET NOCOUNT ON;
    declare @CamProb int;
    IF @PSOffice = 'VAN'
        set @CamProb = 1;
    else
        set @CamProb = NULL;

    INSERT INTO Productions(Title, EntryDate, EntryBy, Camera, Light, Grip, Generator, Expendables,IsDead, Office, CSR1, Indie,ProbCam)
        VALUES (@Title, CURRENT_TIMESTAMP, @EntryBy, 0,0,0,0,0,0, @Office, @CSR1,0,@CamProb);

    SELECT @id = Scope_Identity();

    INSERT INTO PostMortems(ProductionID,Indie) VALUES (@id,0);

    INSERT INTO Deals(Production, Date, SubRentals,InsuranceOnFile,DealOnFile, ChargeDVan, Charge5Tonne, ChargeDVan_out, Charge5Tonne_out, ChargeBulbReplacement) VALUES(@id,CURRENT_TIMESTAMP, 'Cost+10%',0,0, 75.00, 100.00, 150.00, 200.00, 1);

    DECLARE ItemCursor Cursor FOR
        select item from dealitems where id in (46048, 46052, 46036, 1, 46054, 15, 46056, 46057, 46058)
        order by
        case
            when id = 46048 then 1
            when id = 46052 then 2
            when id = 46036 then 3
            when id = 1 then 4
            when id = 46054 then 5
            when id = 15 then 6
            when id = 46056 then 7
            when id = 46057 then 8
            else 9
        end

    DECLARE @Description varchar(100)
    DECLARE @count int
    Set @count = 0

    OPEN ItemCursor

    FETCH NEXT FROM ItemCursor INTO @Description

    WHILE @@FETCH_STATUS = 0
    BEGIN
        INSERT INTO DealMemoItems(Deal, Item, Ord)
        VALUES(@id, @Description, @count)

        SET @count = (@count + 1)

        FETCH NEXT FROM ItemCursor INTO @Description
    END
    CLOSE ItemCursor
    DEALLOCATE ItemCursor
END
这将从表中获取最后一个最高的ID,并将其递增1。您可以将其作为值直接放入SQL insert语句中,如下所示:

INSERT INTO <YOURTABLE> (id, name)
values (
     (SELECT TOP 1 id FROM <yourtable> ORDER BY id DESC) + 1,
     'Goober fish'
);

无法将存储过程更改为使用:

SELECT SCOPE_IDENTITY()
它将返回最后插入的记录的id。您不能依赖于id等于最大id加1,因为id可以超时重用


注意:这是一个SQL Server解决方案,但在其他数据库引擎中通常有等效的解决方案。

您能否检查sp InsertNewDeal正在执行哪些操作,以返回id值。问题可能出在存储的进程上,而不是.net代码上。此外,还应使用SqlConnection conn=new。。。{}ID列的属性标识是否设置为“是”?如果是,它的当前值是什么?选择IDENT_current'table'?好吧,查看SP ID应该是正确的,但鉴于事实并非如此,我打赌有人已手动将记录添加到您的产品表中,禁用标识机制设置IDENTITY_INSERT productions ON,add record,将IDENTITY\u INSERT produtions设置为OFF,但忘记调用DBCC CHECKIDENT“Productions”,重新设定种子,….\u new\u max\u ident\u值插入时,您可以检查哪个表有问题吗?有两张桌子——制作和交易。您从第一个中获取id值并将其插入到后一个中。该id是否已存在于Deals表中?在这种情况下,您对涉及产品的交易具有FK约束。如果需要从Productions表中获得更高的id,可以使用dbcc reseed将该值增加到一个较高的数字。并且希望没有人同时插入另一条记录time@Steve:是的,你一定希望如此。这绝对不是最佳实践。但它回答了他的问题,提出了他的查询……这样它就得到了记录中已经存在的最大值,并将ID增加1。我认为它的问题更复杂。他在那个专栏上有一个身份,所以当有人要求你用一只旧鞋或一个玻璃瓶钉钉子时,有时不需要手动计算,这也被称为,Steve正在谈论解决Y问题,而你正试图帮助他解决X问题。此外,此应用程序在不同的地点复制。复制正在工作。除此之外,应用程序和插入正在其他位置工作。ID增量似乎仅在此位置处于关闭状态。。。。我不确定这是否有帮助……我同意这是一个更好的解决方案,因为它返回连接的id。我的存储过程已经在使用它了。将在上面的编辑中添加存储过程。
SELECT SCOPE_IDENTITY()