-2

我想将记录插入到sql server 2008表中,使用c#asp.net,列值都声明为“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 的原因!

4

2 回答 2

2

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

于 2013-08-12T11:19:52.417 回答
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 身份作为主键可以为您解决这些问题。

于 2013-08-12T11:25:07.987 回答