Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 即使在处理所有命令后,数据库仍被锁定_Vb.net_Sqlite_Executenonquery - Fatal编程技术网

Vb.net 即使在处理所有命令后,数据库仍被锁定

Vb.net 即使在处理所有命令后,数据库仍被锁定,vb.net,sqlite,executenonquery,Vb.net,Sqlite,Executenonquery,即使在我处理完所有命令后,也会出现“数据库已锁定”错误。我正在尝试写入数据库,但底部的INSERT命令失败。我以前让它工作过,但由于某种原因,它现在开始失败了 Sub Btn_SubmitClick(sender As Object, e As EventArgs) If MsgBox("Are you sure?",vbYesNo,"Submit?") = 7 Then 'returns to previous screen Else 'com

即使在我处理完所有命令后,也会出现“数据库已锁定”错误。我正在尝试写入数据库,但底部的INSERT命令失败。我以前让它工作过,但由于某种原因,它现在开始失败了

Sub Btn_SubmitClick(sender As Object, e As EventArgs)

    If MsgBox("Are you sure?",vbYesNo,"Submit?") = 7 Then
        'returns to previous screen
    Else
        'commences insert into database

        Rows = (dataGridView1.RowCount - 1)

        While count < rows 

            'putting grid stuff into variables
            DateStart = dataGridView1.Rows(Count).Cells(0).Value.ToString
            DateEnd = dataGridView1.Rows(Count).Cells(2).Value.ToString 'note other way round
            TimeStart = dataGridView1.Rows(Count).Cells(1).Value.ToString
            TimeEnd = dataGridView1.Rows(Count).Cells(3).Value.ToString
            TotalHours = dataGridView1.Rows(Count).Cells(4).Value.ToString
            OccuranceNo = dataGridView1.Rows(Count).Cells(5).Value.ToString

            'fetching reason ID for Storage

            SQLcommand = SQLconnect.CreateCommand

            SQLcommand.CommandText = "SELECT Reason_ID FROM Reasons WHERE Reason_Name = '" & dataGridView1.Rows(Count).Cells(6).Value.ToString & "'"

            SQLreader = SQLcommand.ExecuteReader

            ReasonID = SQLreader("Reason_ID")

            SQLcommand.Dispose

            'fetching site ID for storage
            SQLcommand = SQLconnect.CreateCommand

            SQLcommand.CommandText = "SELECT Site_ID FROM Sites WHERE Site_Name = '" & dataGridView1.Rows(Count).Cells(7).Value.ToString & "'"

            SQLreader = SQLcommand.ExecuteReader

            SiteID = SQLreader("Site_ID")

            SQLcommand.Dispose

            Oncall = dataGridView1.Rows(Count).Cells(8).Value.ToString

            'increment counter
            Count = Count + 1

            'send to database

            SQLcommand = SQLconnect.CreateCommand

            SQLcommand.CommandText = "INSERT INTO Shifts (Staff_ID, Date_Shift_Start, Date_Shift_End, Time_Shift_Start, Time_Shift_End, Total_Hours, Occurance_No, Site_ID, On_Call_Req, Rate, Approved, Reason_ID) VALUES ('" & userID & "' , '" & DateStart &"' , '" & DateEnd & "' , '" & TimeStart & "' , '" & TimeEnd & "' , '" & TotalHours & "' , '" & OccuranceNo & "' , '" & SiteID & "' , '" & Oncall & "' , '"& "1" & "' , '" & "N" & "' , '" & ReasonID & "')"          
            SQLcommand.ExecuteNonQuery()

            SQLcommand.Dispose

        End While



        MsgBox("Ok")
    End If
End Sub
Sub Btn\u SubmitClick(发送方作为对象,e作为事件参数)
如果MsgBox(“您确定吗?”,vbYesNo,“提交?”)=7,则
'返回上一屏幕
其他的
'开始插入数据库
行=(dataGridView1.RowCount-1)
当计数<行时
'将网格内容放入变量中
DateStart=dataGridView1.Rows(Count).Cells(0).Value.ToString
DateEnd=dataGridView1.Rows(Count).Cells(2).Value.ToString'反过来注释
TimeStart=dataGridView1.Rows(Count).Cells(1).Value.ToString
TimeEnd=dataGridView1.Rows(Count).Cells(3).Value.ToString
TotalHours=dataGridView1.Rows(Count).Cells(4).Value.ToString
OccuranceNo=dataGridView1.Rows(Count).Cells(5).Value.ToString
'正在获取存储的原因ID
SQLcommand=SQLconnect.CreateCommand
SQLcommand.CommandText=“从原因中选择原因ID,原因名称=”&dataGridView1.Rows(Count).Cells(6).Value.ToString&“
SQLreader=SQLcommand.ExecuteReader
ReasonID=SQLreader(“原因\u ID”)
SQLcommand.Dispose
'正在获取存储的站点ID
SQLcommand=SQLconnect.CreateCommand
SQLcommand.CommandText=“从Site_Name=”和dataGridView1.Rows(Count).Cells(7).Value.ToString&”中选择Site_ID”
SQLreader=SQLcommand.ExecuteReader
SiteID=SQLreader(“Site\u ID”)
SQLcommand.Dispose
Oncall=dataGridView1.Rows(Count).Cells(8).Value.ToString
'增量计数器
计数=计数+1
'发送到数据库
SQLcommand=SQLconnect.CreateCommand
SQLcommand.CommandText=“插入轮班(员工ID、日期轮班开始、日期轮班结束、时间轮班开始、时间轮班结束、总小时数、发生次数、站点ID、待命请求、费率、批准、原因ID)值(“&userID&“、”&DateStart&“、”&DateEnd&“、”&DateEnd&“、”、“&TimeStart&“、”、“&TimeEnd&“、”&TotalHours&“、”&OccuranceNo&“,”&SiteID&“,”&Oncall&“,”&“1”&“,”&“N”&“,”&ReasonID&“)”
SQLcommand.ExecuteNonQuery()
SQLcommand.Dispose
结束时
MsgBox(“Ok”)
如果结束
端接头

在显示的代码中,有几点应该更改。由于在代码中未声明任何
连接
命令
读取器
对象,因此它们必须是您正在重用的全局对象不要那样做。

一个持久连接可能有其原因,但查询本质上非常具体,因此尝试重用
DbCommand
DataReader
s可能会适得其反。由于它们与
DbConnection
密切相关,因此可能会发生各种不好的事情。这意味着问题的根源可能在代码中的任何地方

以下内容将循环通过DGV以插入任意多行

Dim SQL=“插入样本(鱼、鸟、颜色、值、价格)值(@f、@b、@c、@v、@p)”
将dbcon用作新的SQLiteConnection(LiteConnStr)
使用cmd作为新的SQLiteCommand(SQL,dbcon)
dbcon.Open()
cmd.Parameters.Add(“@f”,DbType.String)
cmd.Parameters.Add(“@b”,DbType.String)
cmd.Parameters.Add(“@c”,DbType.String)
cmd.Parameters.Add(“@v”,DbType.Int32)
cmd.Parameters.Add(“@p”,DbType.Double)
将fishName设置为字符串
对于dgv2.Rows中作为DataGridViewRow的每个dgvR
'跳过新行,它没有数据
如果dgvR.IsNewRow,则继续
“从另一张桌子上抬起头来
“只是为了缩短代码
userText=dgvR.Cells(0).Value.ToString()
fishName=dtFish.AsEnumerable()。
FirstOrDefault(函数(f)f.Field(字符串)(“代码”)=userText)。
字段(指字符串)(“鱼”)
”“或者
'Dim drs=dtFish.Select(String.Format(“Code='{0}',userText))
'fishName=drs(0)(“鱼”).ToString()
cmd.Parameters(“@f”).Value=fishName
cmd.Parameters(“@b”).Value=dgvR.Cells(1.Value)
cmd.Parameters(“@c”).Value=dgvR.Cells(2.Value)
cmd.Parameters(“@v”).Value=dgvR.Cells(3.Value)
cmd.Parameters(“@p”).Value=dgvR.Cells(4.Value)
cmd.ExecuteNonQuery()
下一个
终端使用
终端使用
  • 注意:与原始代码一样,没有数据验证——也就是说,它假定他们键入的任何内容都是有效的。这很少是一个好的假设
  • 代码使用块来实现
    ,这些块将声明和创建目标对象(dbCommands、connections),并在使用它们时处理它们。它们不能干扰其他地方的代码,因为它们只存在于该块中
  • SQL参数用于简化代码并指定数据类型。按原样连接SQL的一个副作用是,所有内容都作为字符串传递!对于无类型的SQLite,这可能非常糟糕
  • 我将避免在循环中触发多个查找查询。原始代码应该抛出一个
    invalidooperationexception
    ,因为它从未从
    DataReader
    读取
    s。
    
    • 也许最好的方法是将
      站点
      原因
      设置为DGV中的
      组合框
      列,用户可以在其中看到任何文本,并且
      值成员
      已经可用于存储代码。