将数据插入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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章