You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#.NET库存系统E-00000X格式发票号自增实现报错咨询

如何实现E-000000格式发票号的自动递增(C# + SQL)

问题描述

我正在开发一个简易库存系统项目,需要实现发票号按E-000000格式自动递增,首张发票号为E-000001,后续依次为E-000002等。尝试使用语句c = Format(Mid(dr("invoid"), 2, 6) + 1, "E00000#");时出现Format相关错误,请问如何实现该格式存储值的递增?相关代码如下:

public void invoiceno() { 
    try { 
        string c; 
        var sql = "SELECT MAX(invoid) FROM sales"; 
        var cmd = new SqlCommand(sql, con); 
        var dr = cmd.ExecuteReader(); 
        if(dr.HasRows == false) { 
            c = "E-000001"; 
        } else { 
            while(dr.Read()) { 
                c = Format(Mid(dr("invoid"), 2, 6) + 1, "E00000#"); 
            } 
        } 
        label4.Text = c; 
    } catch (Exception ex) { 
        Console.WriteLine(ex.ToString()); 
        Console.Write(ex.StackTrace); 
    } 
}

问题原因

你遇到的错误是因为Format和Mid是Visual Basic的内置函数,C#里并没有这些方法,直接调用会导致编译或运行时错误。另外你的格式字符串"E00000#"也不符合C#的格式化规则,我们需要用C#原生的字符串处理方法来实现这个需求。

解决方案

我们可以分三步实现发票号的递增:

  1. 从数据库读取最大的发票号(如果存在)
  2. 提取发票号中的数字部分,转换为整数并加1
  3. 将递增后的数字重新格式化为E-000000的字符串格式

同时还要注意数据库资源的正确释放(用using语句自动管理),以及处理MAX(invoid)返回DBNull的边缘情况。

修正后的完整代码

public void invoiceno() 
{ 
    try 
    { 
        string invoiceNumber; 
        // 用using语句确保数据库对象自动释放,避免连接泄漏
        using (var cmd = new SqlCommand("SELECT MAX(invoid) FROM sales", con)) 
        { 
            // 执行查询并获取结果,用ExecuteScalar更简洁(仅需单一结果)
            var result = cmd.ExecuteScalar(); 
            
            if (result == DBNull.Value || result == null) 
            { 
                // 数据库中没有记录,使用首张发票号
                invoiceNumber = "E-000001"; 
            } 
            else 
            { 
                // 提取现有发票号的数字部分:从索引2开始取6位(跳过"E-"前缀)
                string existingNumberStr = result.ToString().Substring(2, 6); 
                // 转换为整数并加1,用TryParse避免格式错误导致崩溃
                if (int.TryParse(existingNumberStr, out int existingNumber)) 
                { 
                    int newNumber = existingNumber + 1; 
                    // 格式化为6位数字,前面补0,再拼接前缀"E-"
                    invoiceNumber = string.Format("E-{0:D6}", newNumber); 
                } 
                else 
                { 
                    // 处理异常情况:发票号格式不符合预期
                    invoiceNumber = "E-000001"; 
                    Console.WriteLine("现有发票号格式无效,使用默认初始值"); 
                } 
            } 
        } 
        label4.Text = invoiceNumber; 
    } 
    catch (Exception ex) 
    { 
        Console.WriteLine(ex.ToString()); 
        Console.Write(ex.StackTrace); 
    } 
}

关键细节解释

  • 替换VB方法:用C#的Substring(2,6)替代Mid,用string.Format替代VB的Format
  • 数字格式化:{0:D6}表示将整数格式化为6位数字,不足的位数用0补全(比如1会变成000001)
  • 资源管理:使用using语句包裹SqlCommand,确保对象使用后自动释放,避免数据库连接泄漏
  • 异常处理:增加int.TryParse来处理发票号格式异常的情况,避免程序崩溃
  • 简化查询:用ExecuteScalar替代SqlDataReader,因为我们只需要一个单一的结果(MAX值),代码更简洁

内容的提问来源于stack exchange,提问作者deva ram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:04:10