如何在将数据插入SQLite的表中后获取最后一行Id

本文关键字:最后 获取 Id 一行 数据 插入 SQLite | 更新日期: 2023-09-27 18:34:43

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

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

using (var db = new SQLite.SQLiteConnection(DBPath((            {                var newOrder = new SalesOrder((                {                    CustId = g_intCustId,                    Customer_No = txtBlkCustomer.Text.Trim((,                    Order_Date = DateTime.Today                                   };                .db。插入(新订单(;      }--1---更新:我正在使用SQLite-Net包装器。我没有使用 SQLite -WInRT
我收到以下错误:方法'SQLite.SQLiteConnection.ExecuteScalar(string, params object[]('
的类型参数无法从使用情况中推断。尝试显式指定类型参数。 .db。插入(新订单(;变量密钥 = 数据库。ExecuteScalar("SELECT last_insert_rowid(("(;---2-- 更新
这是类:我的问题是:如何使用上面的代码插入记录后立即获取 SId。 类销售订单 { [主键,自动增量] public int SId { get; set; } public int CustId { get; set; } 公共字符串 Customer_No { get; set; } public DateTime Order_Date { get; set; } }

如何在将数据插入SQLite的表中后获取最后一行Id

您的连接上是否有 ExecuteScalar 方法?

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

在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
}