我有与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组合框,这样的功能是否行得通呢? 它甚至有可能?
提前致谢!
您的代码表示该标识符的信念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
这与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交织和控制不知道这些数据,因为从依赖是一个界面上就
问:什么是FillComboBoxFromMDB设置给你打电话的AddItem过吗?
答:没有,这就是为什么你的错误
尝试像定义一个变量
Dim Value as ComboBox
然后调用这个的AddItem
Value.AddItem(...)
然后在函数的末尾具有
FillComboBoxFromMDB = Value
或者,正如其他的答案,如果你不想使用返回类型像你试图使用。
你有声称它的返回类型是函数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
已传递到子程序。
我在VB6面临同样的问题,找到解决方案了。
这个问题背后的原因是,
我的存储过程有多个SELECT语句。
解决方案:我用SET NOCOUNT ON
在存储过程的开始和SET NOCOUNT OFF
只是最后的选择(输出)语句之前。