【发布时间】:2019-05-24 20:58:19
【问题描述】:
我使用的是 SQL Server 2012。在这个存储过程中,我想获取 @@identity 或 SELECT SCOPE_IDENTITY() 的值。 intMyIdentity 是标识列。
CREATE PROCEDURE [spMyInsert]
(@vchVar AS VARCHAR(20),
@fltVar AS FLOAT)
AS
SELECT TOP 1 intMyIdentity
FROM MyTbl
WHERE vchVar = @vchVar
IF @@rowcount = 0
BEGIN
INSERT INTO MyTbl (vchVar, fltVar)
VALUES (@vchVar, @fltVar)
SELECT @@identity AS intMyIdentity
-- SELECT SCOPE_IDENTITY()
END
如何在 C# 中获取 @@identity 或 SELECT SCOPE_IDENTITY() 的值?
当使用ExecuteScalar时,它返回0,而不是正确的值。
SqlConnection oConn = new SqlConnection(ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString);
oConn.Open();
mCommand.CommandText = "spMyInsert";
mCommand.Parameters.Add(new SqlParameter("@vchVar", txtMyVar.Text));
mCommand.Parameters.Add(new SqlParameter("@fltVar", dblMyVar));
mCommand.Connection = oConn;
mCommand.CommandType = CommandType.StoredProcedure;
intMyIdentity = Convert.ToInt32(mCommand.ExecuteScalar()); --> this always return 0
oConn.Close();
已编辑:此查询有效
IF NOT EXISTS (SELECT 1 FROM myTbl WHERE vchVar = @vchVar)
BEGIN
INSERT INTO myTbl (vchVar, fltVar)
VALUES (@vchVar, @fltVar)
SELECT SCOPE_IDENTITY()
END
【问题讨论】:
-
mCommand.ExecuteReader():
using (var reader = mCommand.ExecuteReader()) { while (reader.Read()) { ... } }。 Stack Overflow 上会有很多例子。 -
您将始终得到以这种方式执行的第一个
SELECT语句的结果,因为它会生成一个结果集。将支票折叠到带有INSERT ... WHERE NOT EXISTS (SELECT 1 FROM MyTbl WHERE vchVar = @vchVar)的语句中;这也修复了并发插入的漏洞。
标签: c# sql-server sql-server-2012 identity sqlcommand