【问题标题】:C# How to reset the Auto Increment ID every 1st date of the MonthC#如何在每月的第一个日期重置自动增量ID
【发布时间】:2023-03-16 01:20:01
【问题描述】:

我很难弄清楚我该怎么做。我想做的是..

例如:
日期:2018 年 10 月 1 日至 2018 年 10 月 31 日,有 2 条记录,如您在提供的图像上所见。您可以看到 id 从 001 开始,依此类推。下个月是 11 月。id 应该重新启动/回到 001 而不是 003。

PS:OrderID 在我的数据库中是 VARCHAR 数据类型

请注意,每个新月都会显示新记录,因此此处看不到过去的记录

希望有人能帮助我

 public partial class SIMSSupplier : UserControl
{
    ADDPOrders order;     
    public SIMSSupplier()
    {
        InitializeComponent();

    }
    public string ORDERID = "000";
    private void ADDOrder_Click(object sender, EventArgs e)
    {        
        order = new ADDPOrders(this);
        POrderID._OrderID(order.lbl_orderID);
        order.ShowDialog(); 
    }
    private void DateOrder_ValueChanged(object sender, EventArgs e)
    {
        DateBetween._DateOrder(DateOrder, DateOrder, PurchaseOrder);
    }
    private void DateOrder2_ValueChanged(object sender, EventArgs e)
    {
        DateBetween._DateOrder(DateOrder, DateOrder2, PurchaseOrder);
    }      
}


public static class DateBetween
{
    public static void _DateOrder(DateTimePicker DateOrder, DateTimePicker DateOrder2, DataGridView PurchaseOrder)
    {
        using (var con = SQLConnection.GetConnection())
        {
            using (var select = new SqlCommand("Select * from Purchase_Order where Date between @date1 and @date2", con))
            {
                select.Parameters.Add("@date1", SqlDbType.Date).Value = DateOrder.Value;
                select.Parameters.Add("@date2", SqlDbType.Date).Value = DateOrder2.Value;
                using (var sd = new SqlDataAdapter(select))
                {
                    var dt = new DataTable();
                    sd.Fill(dt);
                    PurchaseOrder.DataSource = dt;
                }
            }
        }
    }
}

【问题讨论】:

  • 要更新现有值,您可以:全选(真实 ID、OrderID、日期)。按月分组。选择(真实 ID,订单 ID = 索引+1)。然后更新您的数据。
  • 真实ID是什么意思?
  • 我的意思是你必须在表中的某处有一个真实的 ID,一个身份,唯一的,不会被重置。您将如何编辑 Purchase_Order?通过查找具有相同 id 和 date 的行?
  • 很遗憾我没有真实身份,我正在使用 OrderID 来编辑我的数据。
  • 如果你打算每个月重置它,你不能只使用 OrderId。然后,您将需要通过至少与日期和 orderid 进行比较来使用复合材料。否则,您最终会修改/删除具有相同 orderid 的每个条目。

标签: c# sql-server winforms


【解决方案1】:

如果您有可能将字段类型更改为 int,则直接从 SQL 执行此操作要容易得多。您可以使用如下脚本每月自动递增和更改种子值(请注意,如果这对您有用,它还会在开头添加月份编号):

IF (DATEPART(DAY, GETDATE()) = 1)
BEGIN
    DECLARE @reseedValue INT
    SET @reseedValue = CAST(CONCAT(CAST(DATEPART(MONTH, GETDATE()) AS NVARCHAR(4)), '000') AS INT)
    DBCC CHECKIDENT ('[table_name]', RESEED, @reseedValue);
END

【讨论】:

  • 你能详细说明一下吗?,你提供的代码来自sql,你的意思是我每次都需要写那个代码?
  • 如果您将该代码添加到每个插入(或为此选择),它将在第一次的持续时间内在每个查询中重新设置它。不完全是最优的。
  • 您可能有一个存储过程,每天在夜间作业中调用以保持其最佳状态(您可以在每天 00:00 运行该作业一次)。匿名 - 这完全是一个 SQL 解决方案,您需要访问 SQL 实例(更改字段类型、创建存储过程和作业)。您也可以选择 .NET 解决方案,但您需要额外的步骤(例如:始终根据最后一个值计算下一个值 - 当月份不变时)所以我会在这里选择 SQL。
猜你喜欢
  • 2016-03-14
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多