VB6 recordset.open не указано значение для одного или нескольких параметров ошибки - PullRequest
0 голосов
/ 14 марта 2011
Dim adoconn As New ADODB.Connection
Dim rs As New ADODB.Recordset

Private Sub Form_Load()
Dim str As String
Set adoconn = Nothing
Text2.Text = Form4.List2.Text
adoconn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Database1.mdb;Persist Security Info=False"
str = "select * from dept where DEPT =" & Form4.List2.Text
rs.Open str, adoconn, adOpenDynamic, adLockPessimistic
Text1.Text = rs(2)
End Sub

Что не так с rs.open заявлением ??? Это сработало для меня в одной конкретной форме отлично. Но это дает ошибку времени выполнения в другой форме: для одного или нескольких параметров не задано значение ...

Ответы [ 2 ]

1 голос
/ 14 марта 2011

Проблема почти наверняка заключается в значении 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 * спискомимена столбцов, ссылки на поля набора записей по имени (а не по порядковому номеру) и обработка набора записей с нулевыми строками.

0 голосов
/ 10 мая 2013

У меня была эта ошибка, и это в основном означает, что в SQL, который вы передаете в базу данных Access, есть синтаксическая ошибка, которая означает, что Access не распознает один или несколько параметров, переданных ей.Подробности указаны в http://support.microsoft.com/kb/303134.

Наиболее вероятное место для ошибки в дополнительной строке, которую вы передаете "Form4.List2.Text".Самый простой способ увидеть это - запустить запрос непосредственно в Access, и вы должны увидеть диалоговое окно «Ввод значения параметра», которое в основном означает, что доступ не распознает одно или несколько переданных ему имен полей / значений.Кажется, у Access есть привычка изменять внешний вид имен полей, чтобы выявлять неосторожных, например, «Компания / Отдел» в том виде, в каком они отображаются в табличном представлении, на самом деле относится к компаниям или отделам.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...