DapperORM 中 'SELECT CAST(SCOPE_IDENTITY() as int)' 的重要性
Posted
技术标签:
【中文标题】DapperORM 中 \'SELECT CAST(SCOPE_IDENTITY() as int)\' 的重要性【英文标题】:The importance of 'SELECT CAST(SCOPE_IDENTITY() as int)' in DapperORMDapperORM 中 'SELECT CAST(SCOPE_IDENTITY() as int)' 的重要性 【发布时间】:2016-05-26 06:39:45 【问题描述】:我是 C# 新手,对 Dapper.NET 绝对是新手。这是我第一次处理 ORM 和框架,所以我想更多地了解一些语法。
我看过几个INSERT
查询,发现都有这个
SELECT CAST(SCOPE_IDENTITY() AS INT);
在INSERT INTO...;
行之后。
我想知道它的重要性或用途。谢谢你
编辑:这是我编写的一些代码,并且在我测试过的情况下工作。
这是Users.cs
:
public class Users
private int _uid;
private string _fullname;
private string _username;
private string _passcode;
public int uid
get return _uid;
set _uid = value;
public string fullname
get return _fullname;
set _fullname = value;
public string username
get return _username;
set _username = value;
public string passcode
get return _passcode;
set _passcode = value;
这是insertUser.cs
:
public Users InsertData(Users newUser)
string strQry = @"INSERT INTO [Users] VALUES (@uid, @fullname, @username, @passcode);
SELECT * FROM [Users] WHERE [uid] = CAST(SCOPE_IDENTITY() as int);";
using(var conn = InitOpenConn())
try
var ins = conn.Query<Users>(strQry, newUser).Single();
return ins;
catch (Exception ex)
throw ex;
这是Program.cs
:
InsertUser ium = new InsertUser();
try
Users newUser = new Users
uid = 10,
fullname = "James Bond",
username = "james007",
passcode = "095e3cbaf34467fbe1b0f4cd846a57460718d2b4ca504caca28ae5287e8d076db3ddadac11db87ab6ac9dac4b8d84d9a65e67e98ab6ef979c61f277f51df36f3"
;
Users insUsr = ium.InsertData(newUser);
refreshTable();
MessageBox.Show("Added !");
catch (Exception ex)
MessageBox.Show(ex.Message);
【问题讨论】:
【参考方案1】:SELECT CAST(SCOPE_IDENTITY() AS INT)
这行代码返回最后插入的identity表ID。
我们对此有很多用途。就像我们检查了是否插入了值,如果你想对当前插入的电流执行一些操作。
如果您使用的是 EF(ORM) 并且您的表是 EMp_master 那么您可以使用以下语法获取当前插入的 ID
EMp_master obj=new Emp_master
obj.first="suraj";
obj.Emp_master.add(obj);
obj.savechagnes();
int currentinsertedid = obj.empid // this syntax same as SELECT
CAST(SCOPE_IDENTITY() AS INT) both give same record.
【讨论】:
我明白了。谢谢 !。我现在都清楚了。但是,是否必须将SELECT CAST(SCOPE_IDENTITY() AS INT);
添加到我执行的每个INSERT...
查询中?。
这与该列是否是主键(或不是)没有任何关系 - 它只有重要的是该列是一个 identity 列(是的 - 大多数情况下,那些身份列 是 主键 - 但这不是您需要使用 SCOPE_IDENTITY
的原因获取最后插入的 ID...)【参考方案2】:
当您将新行插入到带有 Identity
列的 SQL Server 表中时,ORM 需要从数据库中获取生成的 ID,以便直接在应用程序中更新您的模型。
例子:
/****************** pseudo code ******************/
SomeClass obj = new SomeClass();
obj.SomeProperty = someValue;
// INSERT TO database with Dapper and return inserted ID
int insertedID = SomeMethodToInsertUsingDapper(obj);
obj.ID = insertedID;
// The generated ID is get from the database using
// SELECT CAST(SCOPE_IDENTITY() AS INT);
// so this next line prints the ID generated in the database.
Console.WriteLine(obj.ID);
Dapper 限制:
Dapper 对 Identity Column 有一些限制,所以使用 Dapper
的人使用这种 SQL 语法 SELECT CAST(SCOPE_IDENTITY() AS INT)
从 database
获取生成的 ID
。然后在application
中使用ID
。
获取数据库中数字列中的标识列 每次插入时自动递增。
【讨论】:
这对于 SQL Server 是正确的——其他 RDBMS 可能会以不同的方式处理这一切...... @marc_s SCOPE_IDENTITY() 语法仅对 SQL Server 有效。 所以对于像我这样的新手来说,这条线是为了? @TheQuestioner 到底是哪一行? @TheQuestioner 抱歉,也许我遗漏了一些我认为微不足道的重要信息。现在检查我的答案。以上是关于DapperORM 中 'SELECT CAST(SCOPE_IDENTITY() as int)' 的重要性的主要内容,如果未能解决你的问题,请参考以下文章
为啥我看到 .Cast<int>() 和 .Select(a => (int)a) 之间存在差异?