我使用此代码从数据库表中选择maxID,每次我想添加新记录时,自动生成的ID不是最后一个+1。
public formularAddCompanie()
{
InitializeComponent();
try
{
string cs = "Data Source=CODRINMA\\CODRINMA;Initial Catalog=TrafficManager;Integrated Security=True";
string select = "SELECT max(IDCompanie) FROM Companii";
using (SqlConnection con = new SqlConnection(cs))
{
con.Open();
SqlCommand cmd2 = new SqlCommand(select, con);
SqlDataReader sda = cmd2.ExecuteReader();
DataTable idmax = new DataTable("idmax");
idmax.Load(sda);
if (idmax.Rows[0][0].ToString().Trim() == "") { txtID.Text = "1"; }
else { txtID.Text = (int.Parse(idmax.Rows[0][0] .ToString() + 1).ToString()); }
}
}
catch (Exception er) { MessageBox.Show(er.Message); }
}
进行选择的表格如下所示:
IDCompany Name Address City RegNo
1 A Street NY 123
每次我想添加一条新记录时,自动生成的ID如下所示:11,111,1111。它需要最后一个ID并在其旁边添加另一个1。我错过了什么?
答案 0 :(得分:2)
idmax.Rows[0][0].ToString() + 1
生成string
,而非int
。
你可以尝试
txtID.Text = (Convert.ToInt32(idmax.Rows[0][0]) + 1).ToString();
答案 1 :(得分:2)
有趣的是,请注意
string a = "The meaning of life is " + 42;
将42转换为字符串,创建结果
a == "The meaning of life is 42"
看看这段代码:
(int.Parse(idmax.Rows[0][0] .ToString() + 1).ToString()); }
您正在将idmax.Rows [0] [0]转换为字符串,并将+1添加到字符串的结尾,而不是整数值。尝试
(int.Parse(idmax.Rows[0][0].ToString()) + 1).ToString(); }
请注意idmax.Rows[0][0]
中应该已经有一个整数(正如评论中所指出的那样)。如果是这种情况,您可以简化为
(idmax.Rows[0][0] + 1).ToString(); }
答案 2 :(得分:1)
我只是添加了这个,因为似乎没有人关心海报发布的代码的弱点。 如果要查找将分配给ID列的下一个自动增量值,首先MAX函数不可靠。并发可能会对任何使用MAX的架构造成严重破坏。假设另一个用户已经为自己的INSERT操作检索了MAX,那么根据两台计算机的相对速度,您或其他用户将为IDCompany字段插入重复值。
执行此常见任务的唯一正确方法是对IDCompany列使用IDENTITY属性,当您需要插入新记录时,您应该编写类似这样的内容
try
{
string insert = "INSERT INTO Companii (Name,Address,City,RegNo)
VALUES(@name,@address,@city,@regno);
SELECT SCOPE_IDENTITY()";
using (SqlConnection con = new SqlConnection(cs))
using (SqlCommand cmd = new SqlCommand(insert, con))
{
con.Open();
cmd.Parameters.Add("@name", SqlDbType.NVarChar).Value = txtBoxCity.Text;
.... and on for the other parameters ....
int companyID = Convert.ToInt32(cmd.ExecuteScalar());
... work with the just added company if required
}
}
catch (Exception er)
{ MessageBox.Show(er.Message); }
SCOPE_IDENTITY将返回插入同一范围内的标识列的最后一个标识值,在此上下文范围中表示您的命令使用的连接。
在任何情况下,如果仍然需要MAX方法,则可以使用修改后的查询和SqlCommand.ExecuteScalar简化代码,而不是构建SqlDataReader,填充数据表,尝试使用ifs <解析结果/ p>
string getMax = @"select COALESCE(MAX(IDCompany), 0) + 1 AS maxPlusOne
from Companii"
using(SqlConnection cnn = new SqlConnection(.....))
using(SqlCommand cmd = new SqlCommand(getMax, cnn))
{
cnn.Open();
int nextCompanyID = Convert.ToInt32(cmd.ExecuteScalar());
}
The COALESCE function检查MAX函数的结果,如果它为NULL则返回第二个参数(此处为0),然后只增加1以直接从数据库中获取下一个MAX。 ExecuteScalar将执行仅返回maxPlusOne
别名字段
答案 3 :(得分:0)
试试这个代码段:
将您的String
转换为Int
。使用String
运算符的+
会与int
进行对话,而if (idmax.Rows[0][0].ToString().Trim() == "") { txtID.Text = "1"; }
else {
txtID.Text = Convert.ToString(Convert.ToInt32(idmax.Rows[0][0] .ToString())+1); }
会添加数字。
hotelID expense1 expense2 expense3 expense4 expense5
1 41241 56234 45124 12551 74245
2 31232 45213 51411 67432 23523
3 75463 14352 74214 51541 25236
4 95324 21451 73423 15215 56432
5 12445 64622 12156 52442 52351
6 43542 24141 62532 63255 78454
7 12625 14525 45235 15351 15364
答案 4 :(得分:0)
试试这个,我的id格式是USR001。代码将根据数据库中的最后一个id生成自动id。如果数据库中的最后一个id是USR001,则代码将生成USR002并将id放入文本框
con.Open();
string sqlQuery = "SELECT TOP 1 kode_user from USERADM order by kode_user desc";
SqlCommand cmd = new SqlCommand(sqlQuery, con);
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
string input = dr["kode_user"].ToString();
string angka = input.Substring(input.Length - Math.Min(3, input.Length));
int number = Convert.ToInt32(angka);
number += 1;
string str = number.ToString("D3");
txtKodeUser.Text = "USR" + str;
}
con.Close();