取自本书:“Julia Lerman - 编程实体框架”
在EF中创建新实体时:
var contact = Contact.CreateContact(0, "Camey", "Combs", DateTime.Now, DateTime.Now);
context.Contacts.AddObject(contact);
context.SaveChanges();
生成的sql:
exec sp_executesql N'insert [dbo].[Contact]([FirstName], [LastName], [Title],
[AddDate], [ModifiedDate])
values (@0, @1, null, @2, @3)
select [ContactID]
from [dbo].[Contact]
where @@ROWCOUNT > 0 and [ContactID] = scope_identity()',
N'@0 nvarchar(50),@1 nvarchar(50),@2 datetime2(7),@3 datetime2(7)',
@0=N'Camey',@1=N'Combs',@2='2009-08-30 09:27:31.7449098',
@3='2009-11-30 09:27:31.7449098'
什么是@@ RowCount> 0用于where子句?
我不确定它根据msdn做了什么,它返回受影响的行数, 据我所知,这只是验证联系人记录被添加的一种方式 他们也可以写@@ ROWCOUNT = 1
这是对的吗?
答案 0 :(得分:4)
@@Rowcount
是一个特殊变量。它将始终保存最后一个语句更改或返回的记录数。在这种情况下,最后一个语句是插入。通过在where子句中使用@@Rowcount > 0
,可以确保select仅在insert语句成功时匹配任何记录。
如果他们使用@@Rowcount > 1
代替,则该陈述永远不会成立。该insert语句只插入1行。 1不是> 1.
答案 1 :(得分:3)
@@ Rowcount =受最后一个语句影响的行数
在您的情况下,这会检查插入没有遇到错误,例如具有相同主键的行
答案 2 :(得分:0)
该查询中没有任何内容要求您使用动态SQL。另外我发现在“where”子句中做那种@@ rowcount检查有点傻。由于您刚刚插入,因此它在到达select语句之前会出错,或者@@ rowcount条件始终为true。
我会用这个替换它......
INSERT INTO [dbo].[Contact](
[FirstName], [LastName], [Title],[AddDate], [ModifiedDate])
VALUES (N'Camey', N'Combs', null, '2009-08-30 09:27:31.7449098', '2009-11-30 09:27:31.7449098')
SELECT SCOPE_IDENTITY()
您尝试插入的日期时间值也可能替换为GETDATE()
。
以下是@@rowcount的文档 这是scope_identity()