我想将记录插入到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的原因!
答案 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标识作为主键可以解决这些问题。