C# 在c语言中自动生成字母数字id#
我有一个自动生成id的代码。它正在工作,但我的问题是结果。数字LDLB001到LDLB009可以,但当它达到数字10之后,结果是LDLB010…LDLB011,依此类推。我想要的结果是LDLB010,但我做不到。这是密码。希望你能帮助我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
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()
toString 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 yesString.PadLeft
似乎是一个更好的选择