“对象变量或With块变量未设置”在VB6运行时错误(“Object variable or Wit

2019-07-31 03:09发布

我有与VB6的一个问题。 我有与它的几个组合框对象的形式。 我想通过这需要一个SQL查询作为参数的函数来填充组合框。 因此,代码看起来像这样

Private Function FillComboBoxFromMDB(ByVal sDBName As String, _
                                     ByVal sSQL As String) As ComboBox
    '/*
    ' * Execute SQL in MDB and fill the ComboBox with the results
    ' * Returns filled ComboBox
    ' */
    Dim DB As Database
    Dim DBRecordset As Recordset

    On Error GoTo FillComboBoxFromMDB_ErrHandler

    Set DB = OpenDatabase(sDBName, False, False)

    If Not DB Is Nothing Then
        Set DBRecordset = DB.OpenRecordset(sSQL)
        If Not DBRecordset Is Nothing Then
            If DBRecordset.RecordCount > 0 Then
                Call FillComboBoxFromMDB.AddItem(DBRecordset.Fields(0).Value)
                ' ^^ This row gives the "Object variable or With block variable not set"
            End If
        Else
            Call WriteLog("Unable to execute " & sSQL)
        End If
        DB.Close
    Else
        Call WriteLog("Unable to open " & sDBName)
    End If

    Exit Function
FillComboBoxFromMDB_ErrHandler:
    Call WriteLog("FillComboBoxFromMDB() error: " & Err.Number & " " & Err.Description)
End Function

我把这样的功能。

Private Function Test()
    ' Fill the combobox
    frmMyForm.cmbMyCombo = FillComboBoxFromMDB("Database.mdb", _
                                               "SELECT MyTable.MyText FROM MyTable")
End Function

所以基本上我明白,这归结为实例,但我还没有发现任何关于它的有用的在线。 新的关键字不起作用喜欢它工作在VB.Net。 如何实例化FillComboBoxFromMDB组合框,这样的功能是否行得通呢? 它甚至有可能?

提前致谢!

Answer 1:

您的代码表示该标识符的信念FillComboBoxFromMDB已经在测试过程中的赋值的左侧获得对ComboBox的引用。

这不是功能将与FillCombBoxFromMDB是没有什么,一旦它会试图(和失败)的结果赋值给左手边第一个执行的情况。

你需要通过组合框作为参数。

Private Sub FillComboBoxFromMDB(ByVal sDBName As String, _
                                     ByVal sSQL As String, ByVal cbo As ComboBox)
    '/*
    ' * Execute SQL in MDB and fill the ComboBox with the results
    ' * Returns filled ComboBox
    ' */
    Dim DB As Database
    Dim DBRecordset As Recordset

    On Error GoTo FillComboBoxFromMDB_ErrHandler

    Set DB = OpenDatabase(sDBName, False, False)

    If Not DB Is Nothing Then
        Set DBRecordset = DB.OpenRecordset(sSQL)
        If Not DBRecordset Is Nothing Then
            If DBRecordset.RecordCount > 0 Then
                Call cbo.AddItem(DBRecordset.Fields(0).Value)
                ' ^^ This row gives the "Object variable or With block variable not set"
            End If
        Else
            Call WriteLog("Unable to execute " & sSQL)
        End If
        DB.Close
    Else
        Call WriteLog("Unable to open " & sDBName)
    End If

    Exit Sub
FillComboBoxFromMDB_ErrHandler:
    Call WriteLog("FillComboBoxFromMDB() error: " & Err.Number & " " & Err.Description)
End Sub

这样称呼它: -

 Private Function Test()
 ' Fill the combobox
 Call FillComboBoxFromMDB("Database.mdb", _
                          "SELECT MyTable.MyText FROM MyTable", _
                          frmMyForm.cmbMyCombo ) 
 End Function


Answer 2:

这与VB6的表单控件的工作问题,他们只能在一个形式实例化。 什么刻着胡说! 哦,是的,你可以注册控件驻留在DLL中。有与乐趣! 我跑进这与TCP / IP套接字。

我的解决方案是创建一个SocketDriver接口。 创建一个表单,并把插座的形式。 使表单不可见。 实现窗体上的SocketDriver接口。 现在,您可以通过周围的SocketDriver。

我喜欢安东尼的回答,但我会创建了一个名为“DataFiller”有一个方法的接口。

Public Sub AddItem(item As String)
End Sub

然后在窗体上实现。

Public Sub AddItem(item As String)
   cmbMyCombo.AddItem(item)
End Sub

现在使用签名

Private Sub FillComboBoxFromMDB(ByVal sDBName As String, _
                                 ByVal sSQL As String, ByVal injectWith As DataFiller)
   'yada yada code

   injectWith.AddItem(DBRecordset.Fields(0).Value)

   'yada yada code

End Sub

Private Function Test()
   ' Fill the combobox
   FillComboBoxFromMDB("Database.mdb", _
                                           "SELECT MyTable.MyText FROM MyTable", frmMyForm)
End Function

通过使用界面,你可以有一些涉及分离。 数据访问一无所知窗体或控件,你的320交织和控制不知道这些数据,因为从依赖是一个界面上就



Answer 3:

问:什么是FillComboBoxFromMDB设置给你打电话的AddItem过吗?
答:没有,这就是为什么你的错误

尝试像定义一个变量

Dim Value as ComboBox

然后调用这个的AddItem

Value.AddItem(...)

然后在函数的末尾具有

FillComboBoxFromMDB = Value

或者,正如其他的答案,如果你不想使用返回类型像你试图使用。



Answer 4:

你有声称它的返回类型是函数ComboBox ,但我看不到任何地方你曾经实际设置的返回值。 由于返回值永远不会设置,这将是Nothing的,因此你的错误,当你访问它。

从您提供的使用情况下,我想你想要的是一个辅助子程序是在现有的组合框的作品。 所以,你会这样称呼它:

' Fill the combobox
FillComboBoxFromMDB(frmMyForm.cmbMyCombo, _
                    "Database.mdb", _
                    "SELECT MyTable.MyText FROM MyTable")

和子程序本身就具有这样的特征:

私人小组FillComboBoxFromMDB(BYVAL CBO作为组合框,_ BYVAL sDBName,作为字符串_ BYVAL sSQL作为字符串)

(注意,这是一个Sub不是一个Function )。 在子程序的身体,那就是你有

 Call FillComboBoxFromMDB.AddItem(DBRecordset.Fields(0).Value)

反而有

 cbo.AddItem(DBRecordset.Fields(0).Value)

作用于ComboBox已传递到子程序。



Answer 5:

我在VB6面临同样的问题,找到解决方案了。

这个问题背后的原因是,

我的存储过程有多个SELECT语句。

解决方案:我用SET NOCOUNT ON在存储过程的开始和SET NOCOUNT OFF只是最后的选择(输出)语句之前。



文章来源: “Object variable or With block variable not set” runtime error in VB6