C#操作SQLite插入数据后如何获取最后一条记录的ID作为外键
解决方案
首先排查两个基础错误:
- 你的INSERT语句存在笔误:
INSERT INTRO需要修正为INSERT INTO SCOPE_IDENTITY()是SQL Server专属函数,SQLite环境不支持,无需再尝试该方法
SQLite获取当前连接最近插入的自增ID,确实是用last_insert_rowid(),你之前调用失败是因为执行方法不对:Execute方法只会返回SQL执行的受影响行数,不会返回查询结果,需要改用ExecuteScalar方法执行插入+查询的组合语句,直接拿到返回的ID值。
另外注意不要用字符串拼接的方式传入外键值,改用参数化查询,既避免SQL注入风险,也不会出现类型转换错误。同时C#是大小写敏感的,你第二行的cnn.execute小写写法也会触发编译错误,需要修正为Execute。
修正后的完整代码如下:
public static void SaveProduct(ProductModel product, string filename, string path) { using (IDbConnection cnn = new SQLiteConnection(LoadConnectionString())) { // 插入产品后直接查询自增ID,用ExecuteScalar获取返回结果 int productId = cnn.ExecuteScalar<int>( "INSERT INTO ProductDB (Name, Price) VALUES (@Name, @Price); SELECT last_insert_rowid();", product); // 图片插入用参数化查询传值 cnn.Execute( "INSERT INTO ImageDB (Filename, Path, FK_Product) VALUES (@Filename, @Path, @ProductId);", new { Filename = filename, Path = path, ProductId = productId }); } }
如果你的产品表主键ID是long类型,把ExecuteScalar<int>改成ExecuteScalar<long>即可。另外需要确认ProductDB表的主键字段已经设置了AUTOINCREMENT属性,否则last_insert_rowid()无法返回正确的自增值。
内容的提问来源于stack exchange,提问作者user17227084
相关产品推荐
相关产品推荐

