平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“SQLite数据库中如何获取新插入数据的自增长ID”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
理解这一步时,本教程帮助您了解什么是 SQLite,它与 SQL 之间的不同,为什么需它,以及它的应用程序数据库处理方式。
在这个场景下,SQLite是一个软件库,实现了自给自足的、无服务器的、零设置的、事务性的 SQL 数据库引擎。SQLite是一个增长最快的数据库引擎,这是在普及方面的增长,与它的尺寸大小无关。SQLite 源代码不受版权限制。
落到代码里,SQLite是一个进程内的库,实现了自给自足的、无服务器的、零设置的、事务性的 SQL 数据库引擎。它是一个零设置的数据库,这意味着与其他数据库不一样,您不需在系统中设置。
实际处理时,就像其他数据库,SQLite 引擎不是一个独立的进程,能够按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件。
理解这一步时,SQLite数据库中有一有列名为ID的自增列,项目需求要在向数据库在插入新数据的同时得到新插入数据行的ID。
从实现思路看,我这里用事务,把插入和查询语句借助ExecuteReader一起提交,得到DbDataReader。
从实现思路看,下面介绍SQLite数据库中如何拿到新插入数据的自增长ID,代码如下所示所示:
public bool Insert(string topic, string key, string value, out int id)
{
DbProviderFactory factory = SQLiteFactory.Instance;
using (DbConnection conn = factory.CreateConnection())
{
conn.ConnectionString = _connectionString;
conn.Open();
DbCommand cmdInsert = conn.CreateCommand();
cmdInsert.Parameters.Add(cmdInsert.CreateParameter());
cmdInsert.Parameters.Add(cmdInsert.CreateParameter());
cmdInsert.Parameters.Add(cmdInsert.CreateParameter());
DbTransaction trans = conn.BeginTransaction();
try
{
cmdInsert.CommandText = "INSERT INTO [{0}] ([Topic],[Key],[Value]) VALUES (?,?,?);SELECT LAST_INSERT_ROWID() FROM [{0}]";
cmdInsert.CommandText = string.Format(cmdInsert.CommandText, _messageTableName);
cmdInsert.Parameters[0].Value = topic;
cmdInsert.Parameters[1].Value = key;
cmdInsert.Parameters[2].Value = value;
DbDataReader reader = cmdInsert.ExecuteReader();
trans.Commit();
if (reader.Read())
{
id = int.Parse(reader[0].ToString());
reader.Close();
return true;
}
else
{
SAEC_Log4net.Log.Error("insert message to db fail");
id = 0;
return false;
}
}
catch (Exception e)
{
trans.Rollback();
SAEC_Log4net.Log.Error(e.ToString());
id = 0;
return false;
}
}
}
到此这篇关于SQLite数据库中拿到新插入数据的自增长ID的文章就介绍到这了,更多相关SQLite新插入数据自增长ID内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多兼容脚本之家!