Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c语言中自动生成字母数字id#_C#_Mysql - Fatal编程技术网

C# 在c语言中自动生成字母数字id#

C# 在c语言中自动生成字母数字id#,c#,mysql,C#,Mysql,我有一个自动生成id的代码。它正在工作,但我的问题是结果。数字LDLB001到LDLB009可以,但当它达到数字10之后,结果是LDLB010…LDLB011,依此类推。我想要的结果是LDLB010,但我做不到。这是密码。希望你能帮助我 private void autogen() { try { conn.Open(); String count = "SELECT count(*) + 1 as

我有一个自动生成id的代码。它正在工作,但我的问题是结果。数字LDLB001到LDLB009可以,但当它达到数字10之后,结果是LDLB010…LDLB011,依此类推。我想要的结果是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);
        }
    }

尝试更改此选项:
String strgen=dt.Rows[0][“a”].ToString()
to
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);

希望这有帮助

如@mjwills所述,您可能会遇到这样的情况:两个或多个用户同时执行相同的查询,并以相同的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");

我已经修改了我的代码,感谢@Endi Zhupani和@Azadee的回答。我的用户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);
        }
    }

您当前的方法对比赛条件开放。如果两个用户同时查询,他们将获得相同的ID。这不太好。当两个用户同时运行时,对
count(*)+1
得到相同的结果时会发生什么?如果前缀总是相同的,为什么不直接使用
auto_increment
并通过将前缀添加到数字的前面来“伪造它”?这样,数据库将保证没有重复。当您将标识固定为“自动增量”时,请使用MySQL的
LPAD
()函数添加到@mjwills的注释中,以便始终生成固定长度的字符串。这看起来是
string.PadLeft
函数的较难版本?像@Filburg suggested将不起作用
String strgen=dt.Rows[0][“a”].ToString(“D3”)将不会编译,因为
Object.ToString()
方法不接受参数。啊,您需要先将
dt.Rows[0][“a”]
转换为整数。因此,您可以执行
转换.ToInt32(dt.Rows[0][“a”].ToString()).ToString(“D3”)
D3
指定您希望长度为3,并用0填充。@RaymondNijland yes
String.PadLeft
似乎是一个更好的选择