在C#中自动生成字母数字ID

时间:2018-07-23 13:04:57

标签: c# mysql

我有一个用于自动生成ID的代码。它正在工作,但是我的问题是结果。从LDLB001到LDLB009的数字都可以,但是当数字达到10以后时,结果为LDLB0010 ... LDLB0011,依此类推。我想要的结果是LDLB010,但我做不到。这是代码。希望你能帮助我。

    private void autogen()
    {
        try
        {
            conn.Open();

            String count = "SELECT count(*) + 1 as a FROM tbl_user";

            MySqlDataAdapter sda = new MySqlDataAdapter(count, conn);
            DataTable dt = new DataTable();
            sda.Fill(dt);

            String strgen = dt.Rows[0]["a"].ToString();

            MySqlCommand comm = new MySqlCommand("SELECT * FROM tbl_user WHERE userid = '" + "LDLB00" + strgen + "'", conn);
            MySqlDataReader reader;
            reader = comm.ExecuteReader();
            if (reader.HasRows)
            {
                reader.Read();
                strgen = (int.Parse(strgen) + 1).ToString();

            }
            conn.Close();
            lblUserID.Text = "LDLB00" + strgen;

        }
        catch (Exception et)
        {
            MessageBox.Show(et.Message);
        }
    }

3 个答案:

答案 0 :(得分:0)

由于@Endi Zhupani和@Azadee的帮助,我修改了我的代码。现在,我的userID不重复,并且取决于我的ID,该ID是主键和自动增量。谢谢大家!

    private void autogen()
    {
        try
        {
            conn.Open();

            String count = "SELECT auto_increment as a from information_schema.tables where table_schema = 'ldlb_lib' and table_name = 'tbl_user'";

            MySqlDataAdapter sda = new MySqlDataAdapter(count, conn);
            DataTable dt = new DataTable();
            sda.Fill(dt);

            String strgen = Convert.ToInt32(dt.Rows[0]["a"].ToString()).ToString("D3");

            MySqlCommand comm = new MySqlCommand("SELECT * FROM tbl_user WHERE userid = '" + "LDLB" + strgen + "'", conn);
            MySqlDataReader reader;
            reader = comm.ExecuteReader();
            if (reader.HasRows)
            {
                reader.Read();
                strgen = (int.Parse(strgen) + 1).ToString();

            }
            conn.Close();
            lblUID.Text = "LDLB" + strgen;
        }
        catch (Exception et)
        {
            MessageBox.Show(et.Message);
        }
    }

答案 1 :(得分:-1)

尝试将其从String strgen = dt.Rows[0]["a"].ToString();更改为String strgen = dt.Rows[0]["a"].ToString("D3");

这将确保您始终获得一个三位数的数字并以0开头的数字填充。因此,数字1将为001,数字10将为010,数字100将为100。

此外,不要忘记在此行上将"LDLB00"更改为"LDLB"

MySqlCommand comm = new MySqlCommand("SELECT * FROM tbl_user WHERE userid = '" + "LDLB00" + strgen + "'", conn);

希望这会有所帮助!

答案 2 :(得分:-1)

如@mjwills所述,您可能会遇到2个或更多用户同时执行相同查询并以相同ID结尾的情况。 两种可能的解决方案是让数据库通过使表自动递增主键来创建ID:

CREATE TABLE tbl_user (
    `id` int NOT NULL AUTO_INCREMENT,
    userid varchar(255) NOT NULL,
    PRIMARY KEY (`id`)
);

然后,在id值前面加上字符串。

string sql = "SELECT `id` AS `a` FROM tbl_user WHERE (some condition)"
...
string userid = dt.Rows[0]["a"].ToString("LDLB000")

这将格式化整数,使其始终具有LDLB和0到3个前导零。 例如,如果a = 33,则strgen =“ LDLB033”。并且,如果a = 5000,则strgen =“ LDLB5000”。

另一种解决方案是使用Guid创建唯一标识符:

string userid = Guid.NewGuid().ToString("N");