【问题标题】: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);
}

【问题讨论】:

    标签: c# .net orm frameworks dapper


    【解决方案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 抱歉,也许我遗漏了一些我认为微不足道的重要信息。现在检查我的答案。
    猜你喜欢
    • 2015-07-27
    • 2015-02-11
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    相关资源
    最近更新 更多