在特定行之后插入记录

时间:2013-08-12 11:16:21

标签: c# asp.net sql sql-server-2008

我想将记录插入到sql server 2008表中,使用c#asp.net,列值全部声明为“nvarchar”,第一列subid是主键。在我的代码中,我检索最后一个coulmn id,增加它并将其用作新记录的subid,当我插入记录时,它不会按顺序存储,而是存储在某处的中间。所以下次我尝试检索最后一个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的原因!

2 个答案:

答案 0 :(得分:2)

NVarchChar字段的排序将以字符串形式完成。因此,它将继续发生 NVARCHAR 。正确的方法是在数据库中add an integer column并将其设置为auto-increment。这将确保您在添加新行之前不必每次都获得最大值。

答案 1 :(得分:2)

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

如果subid是NVarChar,正如您所说,排序是在字符串上完成的,而不是数字。这意味着'10'< '2'。假设您有1000条记录,将会订购:

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

所以,每次尝试获得最大数字时,你都会得到字符串'999',因为它在词法上最大。

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

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