在特定行之后插入记录
本文关键字:插入 记录 之后 | 更新日期: 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"<2’。假设你有1000条记录,它们将被订购:
1
10
11
..
19
100
101
...
1000
2
20
21
...
...
999
所以,每次你试图得到最大的数字时,你都会得到字符串"999",因为它在词汇上是最大的。
最简单的解决方案是将列更改为整数,因为它实际上是一个整数。如果你绝对不能改变它,那么至少用零填充这个值,所以用"0001"、"0002"、"0010"代替"1"、"2"、"10"。
此外,由于并发问题,使用MAX+1方法需要使用事务来完成所有操作。使用int标识作为主键可以解决这些问题。
排序将作为字符串进行。因此,NVARCHAR将继续发生这种情况。正确的方法是将数据库中的add an integer column
设置为auto-increment
。这将确保您不必每次在添加新行之前都获得最大值。