将数据插入SQLite表后如何获取最后一行ID [重复]

Posted

技术标签:

【中文标题】将数据插入SQLite表后如何获取最后一行ID [重复]【英文标题】:How to get the last row Id after insert data into table for SQLite [duplicate] 【发布时间】:2013-10-09 07:33:22 【问题描述】:

我正在为 WinRT 应用程序使用 SQLite 和 SQLite-Net Wrapper。其他平台可能有 SQLite,但实现可能不同,例如使用 SQLite-Net api。

如何在插入 SQLite 后立即获取最后一行 ID?谢谢

使用 (var db = new SQLite.SQLiteConnection(DBPath)) var newOrder = new SalesOrder() CustId = g_intCustId, Customer_No = txtBlkCustomer.Text.Trim(), Order_Date = DateTime.Today ; db.Insert(newOrder); --1--- 更新:我正在使用 SQLite-Net Wrapper。我没有使用 SQLite -WInRT 我收到以下错误: 方法“SQLite.SQLiteConnection.ExecuteScalar(string, params object[])”的类型参数 不能从用法中推断出来。尝试明确指定类型参数。 db.Insert(newOrder); var key = db.ExecuteScalar("SELECT last_insert_rowid()"); ---2-- 更新 这是课程: 我的问题是:如何在使用上述代码插入记录后立即获取 SId。 销售订单类 [主键,自动增量] 公共 int SId 获取;放; 公共 int CustId 获取;放; 公共字符串 Customer_No 获取;放; 公共日期时间 Order_Date 获取;放;

【问题讨论】:

@juergend 这不是 php 这是在 WinRT 中使用 SQLite-Net。 我有点困惑,一个 C# 问题作为 PHP 问题的副本被关闭。 @MilkBottle 我和你有同样的问题,但我不知道如何更改代码?我应该在哪里找到我正在使用 nuget 的 SQLite.cs 文件。 【参考方案1】:

您的连接上有 ExecuteScalar 方法吗?然后使用

var key = db.ExecuteScalar<int>("SELECT last_insert_rowid()");

【讨论】:

我收到了上述错误。我做错了什么?我正在使用 SQLite-Net 你不需要像...ExecuteScalar("...", new [] object)这样的事情吗? 我刚刚安装了这个包,它工作正常。另外,“var id = db.Insert(newOrder);”中的 id 是什么?返回?它似乎返回了插入记录的标识。您的身份列是 int 类型吗? @FunksMaName,谢谢它现在有效。【参考方案2】:

在SQLite-net,Insert 方法返回插入的行数(SQLite.cs)。因此,如果您希望它返回最后一行 ID,您可以将其更新为这样做。

当前实施。

public int Insert (object obj, string extra, Type objType)

    if (obj == null || objType == null) 
        return 0;
    


    var map = GetMapping (objType);

    #if NETFX_CORE
    if (map.PK != null && map.PK.IsAutoGuid)
    
        // no GetProperty so search our way up the inheritance chain till we find it
        PropertyInfo prop;
        while (objType != null)
        
            var info = objType.GetTypeInfo();
            prop = info.GetDeclaredProperty(map.PK.PropertyName);
            if (prop != null) 
            
                if (prop.GetValue(obj, null).Equals(Guid.Empty))
                
                    prop.SetValue(obj, Guid.NewGuid(), null);
                
                break; 
            

            objType = info.BaseType;
        
    
    #else
    if (map.PK != null && map.PK.IsAutoGuid) 
        var prop = objType.GetProperty(map.PK.PropertyName);
        if (prop != null) 
            if (prop.GetValue(obj, null).Equals(Guid.Empty)) 
                prop.SetValue(obj, Guid.NewGuid(), null);
            
        
    
    #endif


    var replacing = string.Compare (extra, "OR REPLACE", StringComparison.OrdinalIgnoreCase) == 0;

    var cols = replacing ? map.InsertOrReplaceColumns : map.InsertColumns;
    var vals = new object[cols.Length];
    for (var i = 0; i < vals.Length; i++) 
        vals [i] = cols [i].GetValue (obj);
    

    var insertCmd = map.GetInsertCommand (this, extra);
    var count = insertCmd.ExecuteNonQuery (vals);

    if (map.HasAutoIncPK)
    
        var id = SQLite3.LastInsertRowid (Handle);
        map.SetAutoIncPK (obj, id);
    

    return count;

更新的实施。

public int Insert (object obj, string extra, Type objType)

    if (obj == null || objType == null) 
        return 0;
    


    var map = GetMapping (objType);

    #if NETFX_CORE
    if (map.PK != null && map.PK.IsAutoGuid)
    
        // no GetProperty so search our way up the inheritance chain till we find it
        PropertyInfo prop;
        while (objType != null)
        
            var info = objType.GetTypeInfo();
            prop = info.GetDeclaredProperty(map.PK.PropertyName);
            if (prop != null) 
            
                if (prop.GetValue(obj, null).Equals(Guid.Empty))
                
                    prop.SetValue(obj, Guid.NewGuid(), null);
                
                break; 
            

            objType = info.BaseType;
        
    
    #else
    if (map.PK != null && map.PK.IsAutoGuid) 
        var prop = objType.GetProperty(map.PK.PropertyName);
        if (prop != null) 
            if (prop.GetValue(obj, null).Equals(Guid.Empty)) 
                prop.SetValue(obj, Guid.NewGuid(), null);
            
        
    
    #endif


    var replacing = string.Compare (extra, "OR REPLACE", StringComparison.OrdinalIgnoreCase) == 0;

    var cols = replacing ? map.InsertOrReplaceColumns : map.InsertColumns;
    var vals = new object[cols.Length];
    for (var i = 0; i < vals.Length; i++) 
        vals [i] = cols [i].GetValue (obj);
    

    var insertCmd = map.GetInsertCommand (this, extra);
    var count = insertCmd.ExecuteNonQuery (vals);
    long id = 0;    //New line
    if (map.HasAutoIncPK)
    
        id = SQLite3.LastInsertRowid (Handle);  //Updated line
        map.SetAutoIncPK (obj, id);
    

    //Updated lines
    //return count; //count is row affected, id is primary key
    return (int)id;
    //Updated lines

【讨论】:

我需要这样做:在表中插入一条记录并立即获取该记录的表的主键。上面的代码,我使用db.Insert(newOrder),然后Int Id = newOrder.SId,其中SId是那个表的主键,这个方法正确吗? 如果您使用我的解决方案和var ID = db.Insert(newOrder);,那么 ID 将是 SId,这是您的主键和自动增量列。 我认为 var ID = db.Insert(newOrder) 中的 ID 不是主键,因为它总是返回 1。我尝试了这个 Int Id = newOrder.SId,其中每次我的 ID 都不同创建新记录。你能证实这一点吗?谢谢:) 你有没有按照我的解决方案修改SQLite.cs? 可以使用这个 Int Id = newOrder.SId 这和你的解决方案有什么不同吗?

以上是关于将数据插入SQLite表后如何获取最后一行ID [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQLite 中获取最后插入的行 guid?

在 C# 中使用 SQLite.NET 获取最后一个插入 ID

获取 SQLite 上最后插入行的 ID 的最佳方法

如何从 JayData 事务中获取最后插入 ID?

如何从表中获取最后一个插入 ID

如何有条件地插入或替换 SQLite 中的一行?