【问题标题】:How can I generate an incrementing Billing number that contains text codes?如何生成包含文本代码的递增帐单编号?
【发布时间】:2017-05-31 03:53:53
【问题描述】:

我的 Winform 应用中有一个帐单。我想在计费时自动增加账单号。我有一个新按钮来清除所有内容并开始新的计费。所以我在那个按钮点击事件中创建了一个代码。

 SqlCommand cmd = new SqlCommand("SELECT TOP 1 Bill_No FROM POS order by Bill_No Desc", con);
            int a = Convert.ToInt32(cmd.ExecuteScalar());
            int b = a + 1;
            string Bill = "Bill";
            txt_BillNo.Text = Bill+b.ToString();

现在的问题是当我第二次单击该按钮时。 'a' 获取 varchar 数据。就像比尔 12 一样。对于下一次单击,我想增加 Bill13。但是当它以 varchar 形式从数据库中获取数据时,它不能单独增加数字。那么有没有办法从 varchar 获取数字?像 bill12 中的 12 一样?

【问题讨论】:

  • 你熟悉SQL Server的自动增量吗?
  • 我需要遵循一个模式。所以我在数字前面添加“Bill”字符串。但它被存储为 varchar。我有一个自动递增的主 id 列。
  • 可以使用Substring方法跳过"Bill" :msdn.microsoft.com/en-us/library/hxthx5h6(v=vs.110).aspx
  • @Abhijith 将任何类型的业务逻辑放在一个键中是一个非常严重的设计错误。您将如何在 SQL 中使用该键值?如果您每次都必须解析它,您将如何使用它执行 JOIN?如果您希望某物成为账单,请使用单独的字段,例如DocumentType 并将类型存储在其中。更好的是,创建一个 DocumentTypes 表并将正确的 ID 存储在您的 DocumentTypeId 字段中
  • 你告诉我必须为账单号创建一个单独的表吗?

标签: c# sql-server windows winforms


【解决方案1】:

您可以使用正则表达式从字符串中识别整数。\d+ 是整数的正则表达式。所以

 //System.Text.RegularExpressions.Regex

 resultString = Regex.Match(subjectString, @"\d+").Value;
 returns a string containing the first occurrence of a number in subjectString.

 Int32.Parse(resultString) will then give you the number.

【讨论】:

  • 或者干脆不要尝试在密钥中存储任何类型的业务逻辑。使用正则表达式来提取实际的密钥号码是一个丑陋的黑客。密钥不应包含逻辑。在呈现记录时,正则表达式可能会在非常有限的情况下掩盖问题。密钥仍然无法用于加入、过滤等
【解决方案2】:

你可以用东西来代替前缀,这会给你数值

Select STUFF('Bill1',1,4,'')

【讨论】:

    猜你喜欢
    • 2015-12-29
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 2020-06-24
    • 2023-01-25
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多