jhovyn Ответов: 2

VB6-операция не разрешена, когда объект открыт


Почему я получаю ошибку "операция не разрешена, когда объект открыт"....Вот мой код

Что я уже пробовал:

Форма 2
Option Explicit
Public Report As New CrystalReport1
Public mvCn As New ADODB.Connection

     Public Function printReport()

     Dim strConnectionString As String
     Dim rs As ADODB.Recordset
     Dim strScript As String
 
     strConnectionString = "Provider=SQLOLEDB............"
 
     mvCn.ConnectionString = strConnectionString
     mvCn.CommandTimeout = 0
     mvCn.CursorLocation = adUseClient
     mvCn.Open

     strScript = strScript & "SELECT * FROM employee" & vbCrLf

     Set rs = mvCn.Execute(strScript)

     Report.Database.SetDataSource rs
     Report.AutoSetUnboundFieldSource crBMTNameAndValue
    
     CRViewer1.ReportSource = Report
     CRViewer1.ViewReport
    
     Set Report = Nothing

     End Function

Форма 1.....Вызовите мою функцию "printReport" здесь
Option Explicit

Private Sub Command1_Click()

Form2.printReport

End Sub

Я получаю здесь ошибку
mvCn.ConnectionString = strConnectionString

Maciej Los

VB6? Кажется, это VB.NET...

jhovyn

Я использую VB6. 0 и SQL

2 Ответов

Рейтинг:
17

Andy Lanng

но вы никогда не закрываете связь.

это должно произойти на втором горячем коде. Область вашего подключения является глобальной, поэтому каждый раз, когда ваш код попадает в нее, вы используете один и тот же ее экземпляр. При первом запуске вы устанавливаете строку подключения и открываете соединение. Во второй раз, когда он запускается, соединение все еще открыто (очень плохо).

Ваше соединение должно быть на самом низком уровне. Вот почему вы обычно видите его в блоке "использование". Это делает область соединения еще ниже, чем сама функция.

Всегда тесные связи
Всегда утилизируйте соединения

Это не просто рекомендации, это закон! :Þ

Надеюсь, это поможет ^_^
Энди

Редактировать: обновлен код

Option Explicit
Public Report As New CrystalReport1

Public Function printReport()
     
     Dim strConnectionString As String
     Dim rs As ADODB.Recordset
     Dim strScript As String
 
     strConnectionString = "Provider=SQLOLEDB............"

     Using mvCn As New ADODB.Connection
        'mvCn does not exist outside of this block!
        mvCn.ConnectionString = strConnectionString
        mvCn.CommandTimeout = 0
        mvCn.CursorLocation = adUseClient
        mvCn.Open

        strScript = strScript & "SELECT * FROM employee" & vbCrLf

        Set rs = mvCn.Execute(strScript)
        mvCn.Close()
        'Always close before leaving scope.  This should happen anyway but it's always good to be sure
     End Using
     'That's it.  mvCn no longer exists.  When the code runs again mvCn will be a new instance

     Report.Database.SetDataSource rs
     Report.AutoSetUnboundFieldSource crBMTNameAndValue
    
     CRViewer1.ReportSource = Report
     CRViewer1.ViewReport
    
     Set Report = Nothing

End Function


jhovyn

Спасибо за ваш ответ @Andi...Я уже сделал это, но все еще существует ошибка...У вас есть какие-нибудь идеи, куда мне положить эту замыкающую связь?

Andy Lanng

обновленный

jhovyn

@Andy Lanng
Благодарю вас, сэр, за помощь.Я следовал вашему коду выше, но когда я нажимаю кнопку, мой отчет crystal не отображается и не появляется...

Andy Lanng

Похоже, проблема может быть в другом. Напишите новый вопрос, чтобы привлечь внимание. Я не очень хорошо разбираюсь в Кристалле, поэтому могу предложить очень ограниченную помощь :S

Рейтинг:
1

Maciej Los

Сообщение об ошибке вполне понятно. mvCn уже открыт, потому что он не был закрыт. Вы не можете открыть его снова!
Вы должны проверить, открыто ли соединение:

'check connection state
If mvCn.State = ConnectionState.Open Then mvCn.Close()
'open connection
mvCn.Open()


jhovyn

Спасибо за ваш ответ @Maciej Los..
Не могли бы вы показать мне, где я помещу этот код в свою текущую программу: (..я все еще новичок в программировании

jhovyn

Я добавил этот код, но все равно произошла ошибка :(

If mvCn.State = 1 Then
Public Function printReport()
Dim strConnectionString As String
Dim rs As ADODB.Recordset
Dim strScript As String

strConnectionString = "Provider=SQLOLEDB...." 'Don't show off your connection details
mvCn.ConnectionString = strConnectionString

mvCn.CursorLocation = adUseClient
mvCn.Open

strScript = strScript & "SELECT * FROM employee" & vbCrLf

Set rs = mvCn.Execute(strScript)

    Report.Database.SetDataSource rs
    Report.AutoSetUnboundFieldSource crBMTNameAndValue
    
    CRViewer1.ReportSource = Report
    CRViewer1.ViewReport
    
    Set Report = Nothing

If mvCn.State = 1 Then
mvCn.Close
End If

End Function