Попытка выполнить 2 запроса в одном соединении - PullRequest
0 голосов
/ 29 мая 2020

У меня есть небольшой фрагмент кода, который я пытаюсь запустить, в котором я сначала проверяю, существует ли значение, а затем обновляю свою базу данных, если его нет. Моя проблема в том, что я могу выполнить один запрос или другой, но не оба сразу, потому что в нем говорится, что база данных открыта и к ней нельзя получить доступ. Я точно знаю, что могу писать в базу. Он не защищен от чтения, находится там, где я не могу получить к нему доступ et c. Процедура запускается, если я просто пытаюсь обновить, а не проверять. Проверка определенно не приводит к записи. Я пробовал отдельные процедуры, используя совершенно разные переменные для соединения. Я в тупике. Я пробовал закрывать, использовать, утилизировать, но мне нужен кто-то более умный, чем я, чтобы посоветовать мне, что я делаю неправильно ...

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

Я пробовал отдельные процедуры, я пробовал открывать, закрытие, а затем повторное открытие. Я пробовал одно соединение, пробовал два. Кто-нибудь знает, что я делаю не так, и почему он постоянно говорит мне, что база данных открыта исключительно и почему не позволяет мне писать в нее?

Заранее спасибо тем, кто помогает.

Ответы [ 3 ]

1 голос
/ 29 мая 2020

Я использую этот код, когда пытаюсь выполнить несколько операторов 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
0 голосов
/ 31 мая 2020

Спасибо всем за вашу помощь, но в 2 часа ночи у меня произошло прозрение, и я понял, что проблема была не в базе данных.

Я оставил streamreader открытым, и это было причиной проблемы.

Я учел ваши комментарии и благодарен за помощь в разработке лучшего кода.

0 голосов
/ 29 мая 2020

Фактическое сообщение об ошибке сообщило бы вам, что в соединении уже есть открытая программа чтения. Очевидное решение - закрыть открытое вами средство чтения данных.

В вашем коде есть серьезные проблемы. Вы вызываете 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

Вы можете использовать более эффективный запрос, в зависимости от базы данных.

...