Оператор "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.