【问题标题】:AutoIncremental field自动增量字段
【发布时间】:2014-04-15 08:26:15
【问题描述】:

我需要自动递增 NroFattura 和 AnnoFattura(这是报告的年份):

我不知道该怎么做,是通过 C# 还是通过 Access 设置。 我希望 NroFattura 就像 n = n + 1 AnnoFattura 就像 n = 现在获取年份(函数) 我背后有一个winform(C#)

【问题讨论】:

  • 我想当年份发生变化时,您想将 NroFattura 重置为从 1 重新启动,对吗? (顺便说一句,对于非意大利语人士,NroFattura = InvoiceNumber, AnnoFattura = InvoiceYear)
  • 是的,比如 2014 -> 1 , n+1 然后 2015 -> 1, n+1
  • 您有多用户数据库方案吗?还是只有一个用户在使用数据库?
  • 有时只有一个用户

标签: c# sql winforms ms-access


【解决方案1】:

如果您有一个简单的场景,即一次只有一个用户使用数据库,那么只需找到在特定年份为FatturaNro 插入的最高值

 string query = "SELECT MAX(FatturaNro) FROM yourTableName WHERE AnnoFattura=?";
 OleDbCommand cmd = new OleDbCommand(query, connection);
 cmd.Parameters.AddWithValue("@p1", DateTime.Today.Year);
 object result = cmd.ExecuteScalar();
 int newInvoiceNumber = (result == null ? 1 : Convert.ToInt32(result)+1);

【讨论】:

  • 你应该小心使用这个查询,当它运行时,表被锁定以供其他会话使用,如果你有太多的记录和太多的事务,这将导致大量的表锁
  • @RezaRahmati 单个用户有时在 winforms 应用程序中,问题中没有提到线程。您对其他会话意味着什么?
  • 我这样调整了代码:System.Data.OleDb.OleDbCommand cmd4 = new System.Data.OleDb.OleDbCommand(); cmd4.CommandType = System.Data.CommandType.Text; cmd4.CommandText = "SELECT MAX(FatturaNro) FROM Fatture WHERE AnnoFattura=?"; cmd4.Parameters.AddWithValue("@p1", DateTime.Today.Year);
  • 不要忘记为命令设置连接属性,否则你的代码是等价的
  • 我已经有 4 个查询正在进行,所以连接已经打开,不是吗?
【解决方案2】:

Access 自动递增设置不适用于此类操作。如果您删除项目,计数仍将计数。例如,如果您有 20 个项目,删除了 2 个,则在下一次插入时计数仍会移动到 21。自增字段应该作为记录的唯一标识,而不是“行号”。

您可以为唯一索引添加一个新列,因此可以进行特定于行的编辑。 在 C# 代码中计算 NroFattura 很容易。用正确的值塑造最终的插入字符串并运行它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-06
    • 2013-05-21
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 2011-06-01
    • 2011-02-24
    相关资源
    最近更新 更多