尝试将新记录添加到数据库时,在C#中自动生成和AutoIncrement ID

时间:2015-05-03 18:27:03

标签: c# sql-server auto-increment

我使用此代码从数据库表中选择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。我错过了什么?

5 个答案:

答案 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();