gpt4 book ai didi

c# - 在 SQL Server 数据库中选择最后一条记录并不总是有效

转载 作者:行者123 更新时间:2023-11-30 19:37:34 25 4
gpt4 key购买 nike

有一个声明表,当用户创建一个声明时,它就会被插入到这个表中,每个声明都应该有自己唯一的 NaturalOrderID 分配给它,NaturalOrderID 由系统生成,这里是代码的第一部分,此方法获取最大数量,这是以后要使用的最后一个数字,以提供一个新的唯一NaturalOrderID

 private int GetLastNaturalClaimNo(string finYear)
{
int maxNo = 0;
string query = string.Empty;

query = @"SELECT MAX(CAST(SubString(NaturalOrderId, 4,50) AS int)) FROM Claim
WHERE NaturalOrderId LIKE '" + finYear + "/%' AND (CAST(SubString(NaturalOrderId, 4,50) AS int) BETWEEN 10000 AND 500000) ";

using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["RAC_DARAConnectionString"].ConnectionString))
{
SqlCommand cmd = new SqlCommand(query, conn);// ***OLD Query**
conn.Open();

object result = cmd.ExecuteScalar();

// If no claim of this sort is found, then we are starting a new financial year.
maxNo = string.IsNullOrEmpty(result.ToString()) ? 10000 : Convert.ToInt32(result);
}

return maxNo;
}

然后这个 return maxim 将用于将新的 NaturalOrderId 分配给将要创建的新声明,这里是生成新的 OrderId 的代码先前方法的最大数量

public string GenerateNaturalClaimNumber(int claimId, DateTime date, string userName)
{
// Get the financial period
string finYear = GetFinancialYear(date);

// Get the maximum claim inserted
int maxClaimNo = GetLastNaturalClaimNo(finYear);

int newClaimNo = maxClaimNo + 1;

string naturalNo = finYear + "/" + newClaimNo.ToString();

// Update the claim with the new number ASAP (before someone else grabs the number and creates a duplicate)
using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["RAC_DARAConnectionString"].ConnectionString))
{
string sql = @"UPDATE Claim SET
NaturalOrderId = @naturalNo,
UserName = @userName
WHERE ClaimId = @claimId";
//"UPDATE Claim SET NaturalOrderId = '" + naturalNo + "' WHERE ClaimId = " + claimId.ToString()
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@naturalNo", naturalNo);
cmd.Parameters.AddWithValue("@userName", string.IsNullOrEmpty(userName) ? null : userName);
cmd.Parameters.AddWithValue("@ClaimId", claimId.ToString()); // it was claimNo
conn.Open();
cmd.ExecuteNonQuery();
}
}

return naturalNo;
}

我的问题是,这似乎并不总是有效,因为它有时会将相同的 naturalOrderId 分配给两个或多个不同的声明(附上几个示例的屏幕截图)

NaturalOrderID duplicates

最佳答案

您在应用端计算 naturalOrderID,您 100% 应该使用 SQL Server 提供的 identity 列。可能发生的情况是您同时有多个订单,所以当您提取最大 ID 时,其他人在您计算时正在插入。因此,您的自然顺序不同步。

尝试使用 SQL Server Identity property

关于c# - 在 SQL Server 数据库中选择最后一条记录并不总是有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37615386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com