我有一个用于自动生成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);
}
}
答案 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");