在DapperORM中'SELECT CAST(SCOPE_IDENTITY()as int)'的重要性

.net c# dapper frameworks orm

我是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);
}

一般承认的答案

当您将新行插入带有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

标识数据库中数字列中的标识列,在每个插入时自动递增。


热门答案

SELECT CAST(SCOPE_IDENTITY() AS INT) 

这行代码返回表的最后插入的标识 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. 


许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因