如何使用MS Access数据库在C#中自动生成字母数字ID?

时间:2010-04-03 09:01:07

标签: c# ms-access

我有一个叫emp的表。该表包含三列empidenamesalary。我必须将empid存储为自动生成的ID,例如:E001,E002,E003。我怎么能用C#做到这一点?

5 个答案:

答案 0 :(得分:2)

如果此不是作业:

  • 考虑一下此ID命名方案对您的数据的限制。

  • 如果这些限制是不可接受的,请寻找更好的机制来生成唯一ID。首先,是否真的有必要将字母E与数字一起存储,或者您只需将empid列为INT类型的列,然后以编程方式添加E ?如果您从未在任何地方实际显示ID,请考虑使用例如GUID(请参阅.NET类型System.Guid的文档),因为它们保证是唯一的(出于大多数实际目的)。或者只需在empid列上使用数据库的自动增量功能。

如果此作业:

  • 可以回收(重复使用)已删除记录的ID以及稍后添加的记录吗?

  • 尝试在.NET框架中找到一个方法,该方法使用任意数量的前导零来格式化整数;例如1"001"
    还要尝试在.NET框架中找到相反的方法,例如: "001"1
    使用这两个函数可以在Ennn ID及其数字部分之间进行转换。

  • 从数据库表中检索所有现有ID:
    如果您无法回收ID,请按降序获取它们,告诉DB仅返回该排序结果集中的第一个条目,并从返回的ID值中确定下一个较大的ID。
    如果你可以回收ID,最好按升序获得它们并找到第一个间隙(即当两个相邻ID的数字部分之间的差异大于1时)。建立一个新的ID,使其落入这个空白。


一些示例代码段:

将整数格式化为E...字符串:

int numericPart = 123;   // <-- example input

string empid = numericPart.ToString("'E'000");

E...字符串中提取数字部分 (使用正则表达式,在你的情况下实际上是矫枉过正的):

using System.Text.RegularExpressions;
...

string empid = "E123";   // <-- example input

var empidPattern = new Regex(@"^E(?<NumericPart>\d{3})$");

if (empidPattern.IsMatch(empid))
{
    // extract numeric part from key and convert it to int:
    int numericPart = Int32.Parse(
                          empidPattern.Match(empid).Groups["NumericPart"].Value);
}
else
{
    // 'empid' does not represent a valid key (wrong format)
}

将现有密钥从数据库表加载到集合中:

using System.Data;

// create a new collection that will hold all empid keys in emp
var empidList = new List<string>();

// open a database connection -- you need to add appropriate code here:
using (IDbConnection db = ...)
{
    // define the query for retrieving all empid keys:
    IDbCommand getEmpidList = db.CreateCommand();
    getEmpidList.CommandType = CommandType.Text;
    getEmpidList.CommandText = "SELECT empid FROM emp ORDER BY empid ASC";

    // execute the query and transfer its result set to the collection:
    using (IDataReader reader = getEmpidList.ExecuteReader())
    {
        while (reader.Read())
        {
            empidList.Add(reader.GetString(0));
        }
    }
}

我将把这些部分放在一起,添加上面描述的实际逻辑,并进一步改进代码。

答案 1 :(得分:1)

您可以使用autoincremented int列并添加“E”前缀仅用于显示目的。

答案 2 :(得分:1)

public string GetLatestOrderId()
{
    string ReceivedId = string.Empty;
    string displayString = string.Empty;
    String query = "SELECT MAX(OrderReceivedNo) FROM [Order_Received]";
    String data = DataManager.RunExecuteScalar(ConnectionString.Constr, query);
    ReceivedId = data;
    if (string.IsNullOrEmpty(ReceivedId))
    {
        ReceivedId = "OR0000";//It is the start index of alpha numeric value
    }
    int len = ReceivedId.Length;
    string splitNo = ReceivedId.Substring(2, len - 2);//This line will ignore the string values and read only the numeric values
    int num = Convert.ToInt32(splitNo);
    num++;// Increment the numeric value
    displayString = ReceivedId.Substring(0, 2) + num.ToString("0000");//Concatenate the string value and the numeric value after the increment
    return displayString;
}

答案 3 :(得分:0)

这是我的回答,

public string GetLatestOrderId()
        {
            string ReceivedId = string.Empty;
            string displayString = string.Empty;
            String query = "SELECT MAX(OrderReceivedNo) FROM [Order_Received]";
            String data = DataManager.RunExecuteScalar(ConnectionString.Constr, query);
            ReceivedId = data;
            if (string.IsNullOrEmpty(ReceivedId))
            {
                ReceivedId = "OR0000";//It is the start index of alpha numeric value
            }
            int len = ReceivedId.Length;
            string splitNo = ReceivedId.Substring(2, len - 2);//This line will ignore the string values and read only the numeric values
            int num = Convert.ToInt32(splitNo);
            num++;// Increment the numeric value
            displayString = ReceivedId.Substring(0, 2) + num.ToString("0000");//Concatenate the string value and the numeric value after the increment
            return displayString;
        }

答案 4 :(得分:0)

        Sql DataAdapter sda = new SqlDataAdapter("select * from emp", con);
        Dataset ds = new DataSet();
        sda.Fill(ds, "emp_id");
        string EmpId;

        //this condition checks that table is empty
        // or not if table is empty that bill id is E0001 other wise else par is run
        if (ds.Tables[0].Rows.Count == 0)
        {
            EmpId = "E0001";
        }
        else
        {
            string s = ds.Tables[0].Rows[ds.Tables[0].Rows.Count - 1]["emp_id"].ToString();
            //retriving empid column last cell data.
            int len = s.Length;
            string splitno = s.Substring(3, len - 3); //spliting string
            int num = Convert.ToInt32(splitno); //converting splited string in integer
            num++; //increasing splited string by 1
            EmpId = s.Substring(0, 3) + num.ToString("0000"); //adding String and store in empid string
        }