在特定行之后插入记录

本文关键字:插入 记录 之后 | 更新日期: 2023-09-27 18:27:15

我想使用c#asp.net将记录插入到sql server 2008表中,列值都声明为"nvarchar",第一列的subid是主键。在我的代码中,我检索最后一个coulmn id,递增它并将其用作新记录的子id,当我插入记录时,它不会按顺序存储,而是存储在中间的某个位置。因此,下次我尝试检索最后一个id列值时(尽管我使用"order by"),它会给出现有值,当该值增加时,会给出一个错误,"重复值,不允许"。这是我检索最后一个id值并将其递增的代码:

       SqlCommand myCommand = new SqlCommand("SELECT TOP 1 subid FROM subjects                         
       ORDER BY subid DESC", con1);         
             reader = myCommand.ExecuteReader();
            if (reader.HasRows == false)
            {
                Label4.Text = "1";
                reader.Close();
            }
            else
            {
                while (reader.Read()) // if can read row from database
                {
                    id = reader[0].ToString();
                }
                int n = Convert.ToInt32(id);
                int j = n + 1;
                Label4.Text = j.ToString();

我的插入代码是:

        SqlDataAdapter da = new SqlDataAdapter("SELECT TOP 1 * FROM subjects ORDER BY       
        subid DESC", con);
        SqlCommandBuilder cb = new SqlCommandBuilder(da);
        DataSet ds = new DataSet("subjects");
        da.Fill(ds, "subjects");
        DataRow row = ds.Tables["subjects"].NewRow(); 
        row["subid"] = Label4.Text;
        row["dept"] = (string)Session["deptmnt"];
        row["yr"] = DropDownList2.SelectedValue;
        row["sem"] = DropDownList3.SelectedValue;
        row["subname"] = TextBox1.Text;
        row["subcode"] = TextBox2.Text;
        ds.Tables["subjects"].Rows.Add(row);
        da.Update(ds, "subjects");
        Label10.Visible = true;
        con.Close();

如何将值插入最后一行,请帮忙。我的subid有像"IT10001"、"EC10001"这样的值,可以根据前两个字母来识别部门,这就是我使用varchar的原因!

在特定行之后插入记录

您有表达式SELECT TOP 1 * FROM subjects ORDER BY subid DESC

如果subid是NVarChar,正如您所说,排序是在字符串上完成的,而不是数字。这意味着"10"&lt2’。假设你有1000条记录,它们将被订购:

1 
10
11
..
19
100
101
...
1000
2
20
21
...
...
999   

所以,每次你试图得到最大的数字时,你都会得到字符串"999",因为它在词汇上是最大的。

最简单的解决方案是将列更改为整数,因为它实际上是一个整数。如果你绝对不能改变它,那么至少用零填充这个值,所以用"0001"、"0002"、"0010"代替"1"、"2"、"10"。

此外,由于并发问题,使用MAX+1方法需要使用事务来完成所有操作。使用int标识作为主键可以解决这些问题。

NVarchChar字段的

排序将作为字符串进行。因此,NVARCHAR将继续发生这种情况。正确的方法是将数据库中的add an integer column设置为auto-increment。这将确保您不必每次在添加新行之前都获得最大值。