Монтажная сборка = Assembly.LoadFrom («MyAssembly.dll»); Тип type = assembly.GetType («MyType»); dynamic instanceOfMyType = Activator.CreateInstance (тип);
Таким образом, вы можете использовать функции не с получением методаinfo, а затем вызывать его. Вы будете делать как этот экземплярOfMyType.MethodName (); Но вы не можете использовать Intellisense, потому что динамические типы вводятся во время выполнения, а не во время компиляции.
Причина, по которой вы получаете ошибку при попытке открыть набор записей, заключается в том, что ваша форма не открыта, и когда вы пытаетесь получить доступ к [forms]![frmReportingMain]
, она равна нулю, тогда вы пытаетесь получить свойство на этой нулевой ссылке, и все в порядке , Функция OpenRecordset
не может открывать диалоговое окно, чтобы запрашивать пользовательские входы, такие как пользовательский интерфейс, если он получает эту ошибку.
Вы можете изменить свой запрос, чтобы использовать параметры, которые не привязаны к form
yourTableAllocStart >= pAllocStart
and yourTableAllocEnd <= pAllocEnd
Затем вы можете использовать эту функцию для получения набора записей этого запроса.
Function GetQryAllocDebits(pAllocStart As String, pAllocEnd As String) As DAO.Recordset
Dim db As DAO.Database
Dim qdef As DAO.QueryDef
Set db = CurrentDb
Set qdef = db.QueryDefs("qryAlloc_Debits")
qdef.Parameters.Refresh
qdef.Parameters("pAllocStart").Value = pAllocStart
qdef.Parameters("pAllocEnd").Value = pAllocEnd
Set GetQryAllocDebits = qdef.OpenRecordset
End Function
Недостатком этого является то, что когда вы вызываете это сейчас в форме, которая связан с ним, он не динамически «заполняет пробелы» для вас.
В этом случае вы можете связывать формы qryAlloc_debts
и иметь no where clause в сохраненной запроса, затем используйте формы Filter
, чтобы сделать предложение where. В этом случае вы можете использовать свое предложение where точно, как вы его написали.
Затем, если вы хотите открыть набор записей, вы можете сделать это следующим образом:
Function GetQryAllocDebits(pAllocStart As String, pAllocEnd As String) As DAO.Recordset
Dim qdef As DAO.QueryDef
Set qdef = New DAO.QueryDef
qdef.SQL = "Select * from qryAlloc_Debits where AllocStart >= pAllocStart and pAllocEnd <= pAllocEnd"
qdef.Parameters.Refresh
qdef.Parameters("pAllocStart").Value = pAllocStart
qdef.Parameters("pAllocEnd").Value = pAllocEnd
Set GetQryAllocDebits = qdef.OpenRecordset
End Function
Я знаю, что прошло некоторое время с тех пор, как это было опубликовано, но я хотел бы добавить свою ценность, поскольку я всегда ищу эту проблему:
Сохраненный запрос может быть разрешен:
Set db = CurrentDb
Set qdf = db.QueryDefs(sQueryName)
For Each prm In qdf.Parameters
prm.Value = Eval(prm.Name)
Next prm
Set rst = qdf.OpenRecordset
Для SQL:
Set db = CurrentDb
Set qdf = db.CreateQueryDef("", "SELECT * FROM MyTable " & _
"WHERE ID = " & Me.lstID & _
" AND dWeekCommencing = " & CDbl(Me.frm_SomeForm.Controls("txtWkCommencing")) & _
" AND DB_Status = 'Used'")
For Each prm In qdf.Parameters
prm.Value = Eval(prm.Name)
Next prm
Set rst = qdf.OpenRecordset
Это предполагает, что доступны все значения параметров, т.е. формы открыты, а элементы управления имеют значения.
«У меня есть два параметра в моем наборе записей, и я получал« Слишком мало параметров. Ожидаемая ошибка 2 »при использовании OpenRecordset в MS Access vba, и так я обошел его, и ИТ-РАБОТАЕТ! см. ниже подпрограмму:
'Private Sub DisplayID_Click ()
' 1. Я создал переменные для двух полей параметров xEventID и xExID, как показано ниже:
Dim db As Database
Dim rst As Recordset
Dim xEventID As Integer
Dim xExId As Integer
'2. Устанавливает переменные в поля параметров, как показано ниже:
Set db = CurrentDb
xEventID = Forms!frmExhibitorEntry!txtEventID
xExId = Forms!frmExhibitorEntry!subExhibitors!ExID
'3. Установите сначала OpenRecordSet и назначьте переменные переменным в предложение WHERE. Обязательно включайте все цитаты, амперсанды и пробелы точно так, как они отображаются. В противном случае код будет разрываться! Точно так, как показано ниже:
Set rst = db.OpenRecordset("SELECT tblInfo_Exhibitor.EventID,tblInfo_Display.ExID, tblMstr_DisplayItems.Display " _
& "FROM tblInfo_Exhibitor INNER JOIN (tblMstr_DisplayItems INNER JOIN tblInfo_Display ON tblMstr_DisplayItems.DisplayID = tblInfo_Display.DisplayID) ON tblInfo_Exhibitor.ExID = tblInfo_Display.ExID " _
& "WHERE (((tblInfo_Exhibitor.EventID) =" & xEventID & " ) and ((tblInfo_Exhibitor.ExID) =" & xExId & " ));")
rst.Close
Set rst = Nothing
db.Close
'End Sub
Хотя ссылка [Forms]! ... по умолчанию ссылается на форму, когда QueryDef запускается из графического интерфейса, на самом деле это просто еще один параметр в запросе в VBA. В результате вы не должны перекодировать ваш запрос / создать новый. Кроме того, как отметил @Brad, независимо от того, находится ли параметр в конечном запросе цепочки запросов или нет, вы можете ссылаться на параметр так, как если бы он был в коллекции окончательного запроса. В этом случае вы должны использовать код, подобный этому:
Sub GetQryAllocDebits(dteAllocStart As Date, dteAllocEnd as Date)
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim rst As DAO.Recordset
Set db = CurrentDb()
Set qdf = db.QueryDefs("qryAlloc_Debit")
If CurrentProject.AllForms("frmReportingMain").IsLoaded Then
qdf.Parameters("[forms]![frmReportingMain]![txtAllocStart]") = [forms]![frmReportingMain]![txtAllocStart]
qdf.Parameters("[forms]![frmReportingMain]![txtAllocEnd]") = [forms]![frmReportingMain]![txtAllocEnd]
Else
qdf.Parameters("[forms]![frmReportingMain]![txtAllocStart]") = CStr(dteAllocStart)
qdf.Parameters("[forms]![frmReportingMain]![txtAllocEnd]") = CStr(dteAllocEnd)
End If
Set rst = qdf.OpenRecordset
Do Until rst.EOF
'...do stuff here.
Loop
Set rst = Nothing
Set qdf = Nothing
Set db = Nothing
End Function
Если ссылочная форма открыта, код достаточно умен, чтобы использовать ссылочные элементы управления в форме. Если нет, он будет использовать даты, предоставленные подпрограмме в качестве параметров. Здесь вы найдете, что параметры не понравились, когда я задал их как типы даты (# xx / xx / xx #), даже если поле было датами. Казалось, что это нормально работает, если я задаю параметры как строки. Это, казалось, не проблема, если вытащить значения прямо из элементов управления на формах.