返回已插入的IDENT_CURRENT。

4

我有一个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值。 - Marek
使用SELECT SCOPE_IDENTITY();并将其与Insert一起在一个批处理中执行。 - Ralf
3个回答

6
您可以使用返回新插入 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。再次感谢您。 - Marek

3
假设你的字段名为ID,在查询中加入这个字段:
OUTPUT INSERTED.ID

并在你的C#代码中获取结果。

INSERTED是什么?如果它是一个关键字,那么我从来没有听说过,听起来很有趣。 - King King
不确定它在技术上是什么,但它就像是一个包含语句插入的所有字段的行。文档:http://technet.microsoft.com/zh-cn/library/ms177564.aspx - Anonymoose

3
我认为您可以考虑使用scope_identity()函数而不是ident_current。
SCOPE_IDENTITY、IDENT_CURRENT和@@IDENTITY是类似的函数,因为它们返回插入到标识列中的值。IDENT_CURRENT没有范围和会话限制;它仅限于指定的表。IDENT_CURRENT返回在任何会话和任何范围内为特定表生成的值。有关更多信息,请参阅IDENT_CURRENT(Transact-SQL)。SCOPE_IDENTITY和@@IDENTITY返回在当前会话中任何表中生成的最后一个标识值。但是,SCOPE_IDENTITY仅返回当前范围内插入的值;@@IDENTITY不限于特定范围。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接