我有一个简单的问题,一个不那么简单的解决方案......我目前正在将一些数据插入到这样的数据库中:
kompenzacijeDataSet.KompenzacijeRow kompenzacija = kompenzacijeDataSet.Kompenzacije.NewKompenzacijeRow();
kompenzacija.Datum = DateTime.Now;
kompenzacija.PodjetjeID = stranka.id;
kompenzacija.Znesek = Decimal.Parse(tbZnesek.Text);
kompenzacijeDataSet.Kompenzacije.Rows.Add(kompenzacija);
kompenzacijeDataSetTableAdapters.KompenzacijeTableAdapter kompTA = new kompenzacijeDataSetTableAdapters.KompenzacijeTableAdapter();
kompTA.Update(this.kompenzacijeDataSet.Kompenzacije);
this.currentKompenzacijaID = LastInsertID(kompTA.Connection);
Run Code Online (Sandbox Code Playgroud)
最后一行非常重要.为什么我提供连接?那么有一个名为last_insert_rowid()的SQLite函数可以调用并获取最后一个插入ID.问题是它绑定到一个连接,.NET似乎重新打开并关闭每个数据集操作的连接.我以为从表适配器获取连接会改变一些事情.但事实并非如此.
有谁知道如何解决这个问题?也许从哪里获得持续的连接?或者更优雅的东西?
谢谢.
编辑:
这也是事务的问题,如果我想使用事务,我需要相同的连接,所以这也是一个问题......
Ale*_*ith 65
使用C#(.net 4.0)和SQLite,SQLiteConnection类的属性LastInsertRowId等于最近插入(或更新)元素的主要整数键.
如果表没有主整数键(在这种情况下,rowID是列自动创建),则返回rowID.
有关更多信息,请参阅https://www.sqlite.org/c3ref/last_insert_rowid.html.
至于在单个事务中包装多个命令,在事务开始之后和提交之前输入的任何命令都是一个事务的一部分.
long rowID;
using (SQLiteConnection con = new SQLiteConnection([datasource])
{
SQLiteTransaction transaction = null;
transaction = con.BeginTransaction();
... [execute insert statement]
rowID = con.LastInsertRowId;
transaction.Commit()
}
Run Code Online (Sandbox Code Playgroud)
Wil*_*ler 46
select last_insert_rowid();
Run Code Online (Sandbox Code Playgroud)
您需要将其作为标量查询执行.
string sql = @"select last_insert_rowid()";
long lastId = (long)command.ExecuteScalar(sql); // Need to type-cast since `ExecuteScalar` returns an object.
Run Code Online (Sandbox Code Playgroud)
我正在使用 Microsoft.Data.Sqlite 包,但没有看到 LastInsertRowId 属性。但您不必创建第二次数据库访问来获取最后一个 id。相反,将两个 sql 语句组合成一个字符串。
string sql = @"
insert into MyTable values (null, @name);
select last_insert_rowid();";
using (var cmd = conn.CreateCommand()) {
cmd.CommandText = sql;
cmd.Parameters.Add("@name", SqliteType.Text).Value = "John";
int lastId = Convert.ToInt32(cmd.ExecuteScalar());
}
Run Code Online (Sandbox Code Playgroud)
last_insert_rowid()是解决方案的一部分.它返回行号,而不是实际ID.
cmd = CNN.CreateCommand();
cmd.CommandText = "SELECT last_insert_rowid()";
object i = cmd.ExecuteScalar();
cmd.CommandText = "SELECT " + ID_Name + " FROM " + TableName + " WHERE rowid=" + i.ToString();
i = cmd.ExecuteScalar();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
38707 次 |
| 最近记录: |