Проблема почти наверняка заключается в значении Form4.List2.Text
.
Скажем, значение - одна буква a
.Тогда динамический SQL будет
SELECT *
FROM dept
WHERE DEPT = a;
Если в таблице dept
с именем a
нет столбца, тогда Access (Jet, ACE и т. Д.) Будет рассматривать его как параметр и, поскольку вы указалине указав значение этого параметра, вы получите сообщение об ошибке: «Для одного или нескольких обязательных параметров не задано значение».
Поскольку у вас возникают некоторые проблемы динамического SQL (не говоря уже о других, таких как SQL)добавление в предложение WHERE
), рассмотрите возможность создания базы данных PROCEDURE
с параметрами строго типа для выполнения в коде VBA с использованием объекта команды ADO, например, предполагая, что DEPT
- это INTEGER
:
SQL-код длявыполняется один раз (в ANSI-92 Query Mode ):
CREATE PROCEDURE GetDept
(
arg_dept INTEGER
)
AS
SELECT *
FROM DEPT
WHERE dept = arg_dept;
VBA-код:
Private Sub Form_Load()
Text2.Text = Form4.List2.Text
Dim cat As Object
Set cat = CreateObject("ADOX.Catalog")
cat.ActiveConnection = _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Database1.mdb;Persist Security Info=False"
Dim cmd
Set cmd = cat.Procedures("GetDept").Command
cmd.Parameters(0).Value = List2.Text ' <--- test for type mismatch here '
Set rs = cmd.Execute
Text1.Text = rs(2)
End Sub
Другие соображения заменяют SELECT *
спискомимена столбцов, ссылки на поля набора записей по имени (а не по порядковому номеру) и обработка набора записей с нулевыми строками.