【问题标题】:Return IDENT_CURRENT which was inserted返回插入的 IDENT_CURRENT
【发布时间】:2013-08-18 15:22:12
【问题描述】:

我有INSERT INTO SqlCommand,我需要在插入带有这些值的IDENT_CURRENT 之后显示

SqlCommand sc = new SqlCommand("INSERT INTO kliplat (datum,text,castka,akce,subkey,priznak,rocnik) values (@datum,@text,@castka,@akce,@subkey,@priznak,@rocnik)", spojeni);
         spojeni.Open();

         sc.Parameters.AddWithValue("@subkey", vyber_id_kli);
         sc.Parameters.AddWithValue("@akce", vyberakce);
         sc.Parameters.AddWithValue("@priznak", vyberplat);
         sc.Parameters.AddWithValue("@datum", maskedTextBox1.Text);
         sc.Parameters.AddWithValue("@text", textBox1.Text);
         sc.Parameters.AddWithValue("@castka", textBox2.Text);
         sc.Parameters.AddWithValue("@rocnik", rocnik);

         sc.ExecuteReader();
         spojeni.Close();

这个 IDENT_CURRENT 是:INTEGER IDENTITY PRIMARY KEY

现在我是这样处理这个问题的:

SqlCommand comm = new SqlCommand("SELECT IDENT_CURRENT ('mytable')", conn);
                 spojeni.Open();
                 int max = Convert.ToInt32(comm.ExecuteScalar());

                 spojeni.Close();

但我发现这样做非常危险。

感谢大家花时间阅读本文。

【问题讨论】:

  • @KingKing 抱歉我的简短问题。我需要返回使用此 INSERT INTO SqlCommand 插入的 IDENT_CURRENT 值
  • 使用 SELECT SCOPE_IDENTITY();并与 Insert 一起执行。

标签: c# sql sql-server winforms


【解决方案1】:

假设您的字段名为ID;将此添加到您的查询中:

OUTPUT INSERTED.ID

并在您的 c# 代码中捕获结果

【讨论】:

  • 什么是INSERTED?如果是关键字,奇怪的是我以前从未听说过这个,听起来很有趣。
  • 不确定它在技术上是什么,但它就像一个包含语句插入的所有字段的行。文档:technet.microsoft.com/en-us/library/ms177564.aspx
【解决方案2】:

我认为您可以考虑使用scope_identity() 函数而不是ident_current。

SCOPE_IDENTITY、IDENT_CURRENT 和@@IDENTITY 是类似的函数 因为它们返回插入到标识列中的值。 IDENT_CURRENT 不受范围和会话限制;它仅限于 指定的表。 IDENT_CURRENT 返回为 a 生成的值 任何会话和任何范围内的特定表。有关详细信息,请参阅 IDENT_CURRENT (Transact-SQL)。 SCOPE_IDENTITY 和 @@IDENTITY 返回 在当前任何表中生成的最后一个标识值 会议。但是,SCOPE_IDENTITY 返回仅插入在 当前范围; @@IDENTITY 不限于特定范围。

【讨论】:

    【解决方案3】:

    您可以使用返回新插入的 id 的命令:

    SqlCommand sc = new SqlCommand(@"
        INSERT INTO kliplat (datum,text,castka,akce,subkey,priznak,rocnik) 
        VALUES (@datum,@text,@castka,@akce,@subkey,@priznak,@rocnik);
        SELECT scope_identity();
        ", spojeni);
    ...
    var newIdentity = (long) sc.ExecuteScalar();
    

    【讨论】:

    • 感谢您的回答。请问我怎样才能从其他方法访问这个newIdentity 结果?我创建了 public int newIdentity 但它返回 0 。再次感谢您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多