尝试在一个连接中运行2个查询

uoifb46i  于 2021-08-13  发布在  Java
关注(0)|答案(3)|浏览(178)

我有一小段代码要运行,首先检查值是否存在,如果不存在,则更新数据库。我的问题是我可以运行一个或另一个查询,但不能同时运行这两个查询,因为这样它就表示数据库已打开,无法访问。我肯定我能写进数据库。它不受读取保护,位于我无法访问的位置等。如果我只是尝试更新而不检查,则例程将运行。这张支票肯定没有记录。我尝试过使用完全不同的变量来进行连接的不同例程。我被难倒了。我试过关闭,使用,处理,但我需要一个比我聪明得多的人来告诉我我做错了什么。。。

For Each strfile As String In flist
    Dim pth As String = Path.GetDirectoryName(strfile)
    Dim objReader As New System.IO.StreamReader(strfile)
    Dim dVal As String = String.Empty
    TextLine = objReader.ReadLine()
    SplitLine = Split(TextLine, ",")
    dVal = SplitLine(1)

    Using Dcon As New OleDbConnection
        Dcon.ConnectionString = dbProvider
        Dcon.Open()

        Dim q1 As String = "SELECT Shares.[_Date] FROM Shares WHERE (((Shares.[_Date])=" & dVal & "))"
        Dim comd As OleDbCommand = New OleDbCommand(q1, Dcon)
        comd.ExecuteReader()

        Dim q2 As String = "INSERT INTO Shares (Code, _Date, _Open, _High, _Low, _Close, _Volume) " &
                                                                  "SELECT F1, F2, F3, F4, F5, F6, F7 FROM [Text;HDR=NO;DATABASE=" & pth & "].[" & Path.GetFileName(strfile) & "];"

        Dim cmd As OleDbCommand = New OleDbCommand(q2, Dcon)

        cmd.ExecuteNonQuery()
        Dcon.Close()
    End Using
Next

我尝试过不同的程序,我尝试过打开,关闭,然后重新打开。我试过一个连接,我试过两个。有人知道我做错了什么吗?为什么它总是告诉我数据库是以独占方式打开的,为什么它不让我写入它?
提前感谢那些帮助过你的人。

yizd12fk

yizd12fk1#

我在尝试执行多个sql语句时使用以下代码:

Dim ConnectionString As String = ("Connection_String")
        'LoginsVal is a Table,
        Dim SqlStr1 As String = ("Select Count(Accounts.DtCrtd) FROM Accounts WHERE Accounts.DtCrtd > " & Now.Date & ";")
        Dim SqlStr2 As String = ("INSERT INTO LoginsVal(LoginNm,DtMdfd) VALUES ('Test1'," & Now.Date & ");")
        'DtCtrtd is Date DataType, Accounts is the Table Name
        Dim ThisCmd1, ThisCmd2 As New OleDbCommand
        Using ThisConn As New OleDbConnection With {.ConnectionString = ConnectionString}
            ThisConn.Open() 'Open connection
            With ThisCmd1
                .Connection = ThisConn
                .CommandType = CommandType.Text
                .CommandText = SqlStr1
            End With
            'Debug.WriteLine(ThisCmd1.ExecuteScalar) 'use to test only without if statement below.
            If Convert.ToInt32(ThisCmd1.ExecuteScalar) <= 0 Then
                Debug.WriteLine("No records found")
            Else
                'Your Next SqlStatement
                With ThisCmd2
                    .Connection = ThisConn
                    .CommandType = CommandType.Text
                    .CommandText = SqlStr2
                End With
                Debug.WriteLine("Num of Rows affects is : " & ThisCmd2.ExecuteNonQuery)
            End If
            ThisCmd1.Dispose()
            ThisCmd2.Dispose()
            ThisConn.Close() 'Close connection
        End Using
jgzswidk

jgzswidk2#

实际的错误消息会告诉您连接上已经有一个打开的读卡器。显而易见的解决方案是关闭打开的数据读取器。
你的代码有一些严重的问题。你打电话来 ExecuteReader 这就是打开数据读取器的原因,它阻止了您的第二个命令,但您实际上从未对该数据读取器执行任何操作。您没有将它赋给变量,因此无法从中获取数据,也无法关闭它。你可以这样做:

Dim reader = comd.ExecuteReader()

'Use reader here.

reader.Close()

正确的方法是使用 Using 尽管如此:

Using reader = comd.ExecuteReader()
    'Use reader here.
End Using

也就是说,如果您所要做的只是确定数据是否存在,而不是实际使用该数据,那么您根本不需要数据读取器。只需使用返回 Boolean 打电话给我 ExecuteScalar ,例如。

Using connection As New OleDbConnection("connection string here")
    connection.Open()

    Dim query As New OleDbCommand("SELECT COUNT(*) > 0 FROM MyTable", connection)

    If CBool(query.ExecuteScalar()) Then
        'The table does contain data.
    End If
End Using

根据数据库的不同,您可以使用更高效的查询。

w7t8yxp5

w7t8yxp53#

谢谢大家的帮助,但凌晨2点我突然醒悟过来,意识到不是数据库出了问题。
我让streamreader开着,这就是问题的原因。
我已经接受了你的意见,但感谢在开发更好的代码的帮助。

相关问题