Оператор "LIKE" работает в MS Access, но не в ADO

Я пытаюсь отфильтровать записи, используя "Like" со звездочками, это работает, когда Access 2010 возвращает много записей. Я озадачен, почему он ничего не возвращает при использовании с ADO. Код включает в себя несколько таблиц и столбцов, поэтому для устранения неполадок я сделал простой запрос. Вот код:

strsql = "SELECT tproducts.Prod_Name FROM tproducts " _
& " WHERE tproducts.Prod_Name Like " & Chr(34) & "SO*" & Chr(34)

Set cn = New ADODB.Connection
cn = connString
cn.Open
Set rs = New ADODB.Recordset
rs.Open strsql, cn, adOpenStatic, adLockOptimistic

' test here
iRecCount = rs.RecordCount
rs.MoveFirst

Recordcount возвращает -1.

Когда "Like" заменяется на "equals", он возвращает правильную запись, поэтому я уверен, что он может подключиться к базе данных, например:

strsql = "SELECT tproducts.Prod_Name FROM tproducts " _
& " WHERE tproducts.Prod_Name = " & Chr(34) & "SONY Vaio SVD13213CXB" & Chr(34)

Есть ли особый способ использовать оператор Like в ADO?

Какие еще способы я могу отфильтровать для получения результатов, аналогичных использованию "Мне нравится"? Например, найти все продукты "СВД"?

3 ответа

Решение

В MS Access подстановочный знак почти всегда *, вне MS Access это почти всегда%, поэтому

str = "SELECT tproducts.Prod_Name FROM tproducts) " _
& " WHERE tproducts.Prod_Name Like ""SO%"""

Однако я настоятельно рекомендую перейти к параметрам, чтобы избежать ряда серьезных проблем.

DAO, безусловно, лучший выбор для ACE / Jet (грубый пример строк таблицы циклов в Access, с использованием или без использования Private Const)

Вы не можете рассчитывать на RecordCount. Он часто возвращает -1, даже если строки были возвращены. Он вернет фактическое количество, только если вы используете курсор на стороне клиента.

Вместо этого используйте rs.EOF для проверки конца набора записей. Попробуйте что-то вроде следующего:

Set cn = New ADODB.Connection
cn = connString
cn.Open
Set rs = New ADODB.Recordset
rs.Open strsql, cn, adOpenStatic, adLockOptimistic

' very innefficient way to find the record count, but gives you the idea.  If you just care about record count use "COUNT(*)" in your query
do while not rs.eof
  iRecCount = iRecCount + 1
  rs.MoveNext
loop
       dim strSQL as string
 dim RC as variant
 dim rs as adodb.recordset
 set rs = new adodb.recordset
 strSQL = "Select * from sometable"

  rs.open strSQL,currentproject.connection, 
  adopenDynamic, adlockOptimistic

  RC = rs.recordcount
  rs.close
  set rs = nothing

проблема но..

       dim strSQL as string
 dim RC as variant
 dim rs as adodb.recordset
 set rs = new adodb.recordset
 strSQL = "Select * from sometable"

 rs.Open strSQL, CurrentProject.Connection,
 adOpenKeyset, adLockReadOnly

 RC = rs.recordcount
 rs.close
 set rs = nothing

will return the correct record count.
Другие вопросы по тегам