【发布时间】:2020-01-26 17:46:27
【问题描述】:
我正在运行以下代码的 2 个实例,它们连接到 System.Data.SQLite 数据库。当我使用任何一个实例向数据库中插入一行时,从其他实例读取时自动递增的值 (ID) 不正确。这背后的原因是什么?
Imports System.Data.SQLite
Public Class Form1
Public cnn As SQLiteConnection
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
cnn = New SQLiteConnection("Data Source=\\abc\xx\x_backup.db;Password=password;Connect Timeout=55;FailIfMissing=True")
cnn.ParseViaFramework = True
cnn.Open()
End Sub
Public Function inserttoTable(ByVal sql As String) As DataTable
Try
sql = "SELECT max(ID) FROM joblog;"
Dim mycommand As SQLiteCommand = New SQLiteCommand(cnn)
mycommand.CommandText = sql
MsgBox(mycommand.ExecuteScalar)
sql = "INSERT INTO joblog (jobid) VALUES (123);"
mycommand = New SQLiteCommand(cnn)
mycommand.CommandText = sql
MsgBox(mycommand.ExecuteNonQuery())
Catch ex As Exception
MsgBox(ex.ToString)
End Try
【问题讨论】:
-
首先,你的sql语句应该被做成存储过程(总是)。其次,在一个 INSERT 函数中有两条 SQL 语句。你到底想做什么?
-
@ciammarino
should be made into stored procedures (always)他们为什么要这样做; Microsoft 确实为此保留了一个名为CommandType的属性,用于选择文本和或存储过程。 在这种情况下,将不同的字符串分配给同一个变量有什么问题;So that will leave you with wonky results,你能解释一下奇怪的结果吗? -
为什么要使用存储过程:关注点分离、抽象、安全、最佳实践,使用 SP 的原因有很多,请参阅this stack question。
-
@ciammarino 我知道原因是什么,而且 SP 肯定很好用,我的意思是,为什么在这里使用一个;你提到它应该是。如果不合二为一,你觉得把它做成一个存储过程会解决这里的OP问题吗?
-
@ciammarino 很好,你确实提出了一个很好的建议,使用 SP,这很好,但 TBH 不是这里的问题。
标签: .net vb.net sqlite system.data.sqlite