【问题标题】:Increment by 1 ASP.NET递增 1 ASP.NET
【发布时间】:2014-03-01 14:43:11
【问题描述】:

我在 ASP.NET 中有一个小问题。我试图在列中获取 MAX 数,然后将其递增 1。 像这样的例子:

SqlConnection con= new SqlConnection(ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString);
con.Open();

string db = "instert into FJ(C1, C2, C3) values (@c1 , @c2 ,@c3)";
SqlCommand com = new SqlCommand(db, con);
com.Parameters.AddWithValue("@c1", TextBox1.Text);
com.Parameters.AddWithValue("@c2", com .CommandText = "declare @a float set @a = (select MAX(C2) from FJ)+1 INSERT INTO [FJ]([C2]) VALUES (@a)");
com.Parameters.AddWithValue("@c3", TextBox3.Text);

com.ExecuteNonQuery();
con.Close();

C2 列增加 1 但其他列为空。如果我评论 C2 行 TextBox1 和 3 被添加到数据库中。 有什么问题?

附注我不允许编辑数据库。我需要用 ASP.NET 代码来实现。

【问题讨论】:

  • 为什么不在数据库中直接定义一个IDENTITY列?
  • 因为我不允许编辑数据库。我需要在 ASP.NET 代码中制作它。这是我的主管告诉我的。 ://
  • 问题在于,在并发(多个并发使用)的情况下,如果不由数据库管理,这可能很容易失败。正确工作的正确工具 - 如果不允许您更改数据库,请与可以的人合作。
  • 但是有什么方法可以在不使其他列为 NULL 的情况下增加一吗?
  • 在表格设计中 - 使列成为自动递增的 IDENTITY 列。

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


【解决方案1】:

C2 增量可以在数据库端设置。不需要这些计算。

How can I make a primary key as AUTOINCREMENT

更新: 那么你做错了。您正在更改以下命令:

com.Parameters.AddWithValue("@c2", com .CommandText = "declare @a float set @a = (select MAX(C2) from FJ)+1 INSERT INTO [FJ]([C2]) VALUES (@a)");

这就是其他列为空的原因。

应该是:

SqlConnection con= new SqlConnection(ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString);
con.Open();

string db = "declare @a float; set @a = (select MAX(C2) from FJ)+1;instert into FJ(C1, C2, C3) values (@c1 , @a ,@c3)";
SqlCommand com = new SqlCommand(db, con);
com.Parameters.AddWithValue("@c1", TextBox1.Text);
com.Parameters.AddWithValue("@c3", TextBox3.Text);

com.ExecuteNonQuery();
con.Close();

【讨论】:

  • 我知道主键,但我不能编辑数据库。我需要在 ASP.NET 代码中制作它。这是我的主管告诉我的。 ://
  • 它不起作用。现在 C2 列是 NULL 并且 TextBox 1 和 3 被添加到数据库中。
【解决方案2】:

嗯,我也遇到过类似的情况。

使用身份始终是一个很好的解决方案,但是,当 INSERT 操作失败时,它会丢失新生成的 ID

查看您的T-SQL,我发现一个问题:当两个操作在“相同”时间开始时会发生什么,即当C2 列的最后一个值是10 时?将有两行具有11 值,或者如果该列具有unique index,则首先启动的INSERT 将具有新值,而第二个将失败......我认为这会造成一些损害。

我的建议是将INSERT 语句更改为这种方式:

INSERT INTO FJ( C1, C2, C3 )
SELECT @c1, ISNULL( MAX( C2 ) + 1, 1 ), @c3
  FROM FJ;

这样会更安全。

再见!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    • 2021-09-06
    相关资源
    最近更新 更多