.net 运行两个实例时,自动增量不正确

.net 运行两个实例时,自动增量不正确,.net,vb.net,sqlite,system.data.sqlite,.net,Vb.net,Sqlite,System.data.sqlite,我有以下代码的两个实例正在运行,它们连接到System.Data.SQLite数据库。当我使用任何一个实例向数据库中插入一行时,从其他实例读取时,自动递增的值ID是不正确的。这背后的原因是什么 导入System.Data.SQLite 公开课表格1 公共cnn作为SQLiteConnection 私有子窗体1\u Loadsender作为System.Object,e作为System.EventArgs处理MyBase.Load cnn=新SQLiteConnectionData Source=

我有以下代码的两个实例正在运行,它们连接到System.Data.SQLite数据库。当我使用任何一个实例向数据库中插入一行时,从其他实例读取时,自动递增的值ID是不正确的。这背后的原因是什么

导入System.Data.SQLite 公开课表格1 公共cnn作为SQLiteConnection 私有子窗体1\u Loadsender作为System.Object,e作为System.EventArgs处理MyBase.Load cnn=新SQLiteConnectionData Source=\\abc\xx\x\u backup.db;密码=密码;连接超时=55;FailIfMissing=True cnn.parsevia framework=True 有线电视新闻网,开门 端接头 公共函数inserttoTableByVal sql作为字符串作为数据表 尝试 sql=从作业日志中选择maxID; Dim mycommand As SQLiteCommand=New SQLiteCommand mycommand.CommandText=sql MsgBoxmycommand.ExecuteScalar sql=插入作业日志作业ID值123; mycommand=newsqlitecommandcnn mycommand.CommandText=sql MsgBoxmycommand.ExecuteOnQuery 特例 MsgBoxex.ToString 结束尝试 当我使用任何一个实例向数据库中插入一行时,从其他实例读取时,自动递增的valueID是不正确的


我怀疑这是因为您的连接和命令没有关闭/释放,所以它们保持打开状态

连接的最佳建议是使用它,然后关闭/处置它。命令也是如此,请确保它们已被释放

有一种方法可以做到这一点:

以整数形式返回 sql=从作业日志中选择maxID; '获取标量返回值的第一个查询 使用cnn作为新的SQLiteConnectionData Source=\\abc\xx\x\u backup.db;密码=密码;连接超时=55;FailIfMissing=True 使用mycommand作为新的SQLiteCommandsql,cnn cnn.parsevia framework=True 有线电视新闻网,开门 intReturn=mycommand.ExecuteScalar MessageBox.ShowintReturn 终端使用 终端使用 '实际执行插入的第二个查询 sql=插入作业日志作业ID值123; 使用cnn作为新的SQLiteConnectionData Source=\\abc\xx\x\u backup.db;密码=密码;连接超时=55;FailIfMissing=True 使用mycommand作为新的SQLiteCommandsql,cnn cnn.parsevia framework=True 有线电视新闻网,开门 intReturn=mycommand.ExecuteOnQuery MessageBox.ShowRecords受影响&返回 终端使用 终端使用
另一方面,请注意使用,否则您可能容易受到SQL注入攻击。

我使用的函数在某种程度上等同于SQL Server中的Scope\u Identity。我没有SqLite数据库,因此无法进行测试。我不确定您是否可以在SqLite中链接命令,但如果不能,只进行两个单独的查询。ExecuteScalar返回结果集中第一行的第一列,这是您想要的数字

私有子按钮2\u单击发件人作为对象,e作为事件args处理按钮2。单击 暗淡的纽伊德一样长 将cn用作新的SQLiteConnectionYour连接字符串 使用cmd作为新的SQLiteCommandINSERT插入作业日志jobid值123;选择最后一个\u插入\u行ID NewID=CLngcmd.ExecuteScalar 终端使用 终端使用 Show$新ID为{NewID} 端接头
简单的回答是,您不应该使用共享的sqlite数据库文件,它不稳定,并且数据库文件很容易损坏。使用mariadb/postgresql是一个更好的主意

我认为您的问题与事务有关,您应该在更新后立即手动提交更改以更新数据库文件

1. SQLiteTransaction trans = conn.BeginTransaction();
2. select max(id), insert...
3. trans.commit();

首先,您的sql语句应该始终被制作成存储过程。其次,在一个INSERT函数中有两条SQL语句。你到底想做什么?@ciammarino应该被做成存储过程——为什么总是这样;Microsoft确实为这个名为CommandType的对象保留了一个属性来选择文本和/或存储过程。在这种情况下,将不同的字符串赋给同一个变量有什么错;所以这会给你留下不可靠的结果,你能解释不可靠的结果吗?为什么要使用存储过程:关注点分离、抽象、安全性、最佳实践,有一个使用SPs的详细原因列表,请看。@ciammarino我知道原因是什么,SP肯定很好使用,我的观点是,为什么在这里使用一个;你说应该是。如果没有将其制作成一个存储过程,您认为将其制作成一个存储过程会解决这里的OP问题吗?@ciammarino很好,您确实提出了一个很好的建议,使用SP,这很好,但TBH不是这里的问题和/或问题。我怀疑这是因为您的连接和命令没有关闭/释放,所以它们保持打开状态。因此,当两个实例有打开的连接时,sqlite无法处理db?@它在写入时会锁定整个数据库。。。技术上可以,但这是一个比赛条件,我自己也看到了。我不想这样
o每次插入后关闭和打开连接。ADO.net处理连接池。我看不出有什么理由不关闭它。如果要执行批处理更新,请使用DataAdapter.update。