Проблема в чтении данных формы файла MDB в VB6 - PullRequest
0 голосов
/ 02 ноября 2010

Я использую vb6 и пытаюсь прочитать файл mdb в

Set rs = New ADODB.Recordset
rs.Open SqlStr, mvarDB

, это моя строка критериев "id = 'SA / -AS 0N' And mp <> 'N'", естьзапись в таблице, id которой является вышеупомянутой, и ее столбец mp не равен N., но когда

   rs.MoveFirst

в окне просмотра, я могу видеть значения первого столбца.но когда запускается ниже, заголовок говорит:

   rs.Filter = sCriteria

": значение либо BOF, либо EOF имеет значение True, либо текущая запись удалена. Запрошенная операция требует текущей записи.>:" Оцените вашу помощь.

Ответы [ 5 ]

1 голос
/ 02 ноября 2010

Я также согласен, сначала убедитесь, что у вас есть записи. Вам не нужно сразу брать rs.MoveFirst.

If rs.RecordCount > 0 Then

 rs.Filter = strCriteria

End If

Также убедитесь, что столбец, по которому вы фильтруете, действительно существует в наборе записей.

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

1 голос
/ 03 ноября 2010

Если значение столбца mp равно NULL, то использование критерия фильтра mp <> 'N' приведет к удалению строки из отфильтрованного набора результатов.

В SQL используется та же трехзначная логика . Идея состоит в том, что mp <> NULL оценивается как UNKNOWN, и в результате строка удаляется в SQL DML (но сохраняется в SQL DDL ...)

Если вы используете SQL, вы можете использовать предикат (mp <>'N' OR mp = NULL). К сожалению, ADO имеет известную проблему , которая не позволяет использовать NULL в критериях свойств фильтра.

Ошибки

3VL craziness и ADO должны привести вас к выводу, что следует избегать значения NULL. В идеале вы должны удалить NULL способных столбцов в базе данных. В краткосрочной перспективе вы можете убедиться, что ваши представления и процедуры не выставляют значение NULL. Вы можете использовать другое «волшебное» буквальное значение, но, возможно, лучше вернуть подходящее значение домена по умолчанию. Например, это может быть случай, когда любое значение для mp, отличное от N, должно быть Y:

SELECT id, IIF(mp = 'N', 'N', 'Y')
  FROM YourTable;
0 голосов
/ 05 ноября 2010

нет необходимости делать это

rs.MoveFirst

запись автоматически позиционируется на первой записи, если что-либо найдено

Далее это необходимо

If rs.EOF=false Or rs.BOF=false Then
' manipulate recordset here
End If
0 голосов
/ 04 ноября 2010

хорошо, проблема была в 2 раза, когда комментарий был полезен, но проблема была,

1 - файл mdb имел тип данных worng, который был NUMBER, поэтому каждый нуль в строке приводил к достижению EOF записи. Поэтому я установил тип данных в TEXT.

2-НАЙТИ НУЛЬ В КОМПЛЕКТЕ ЗАПИСИ Я ДЕЛАЮ

dataSet.Find sCriteria, adSearchForward 'sCriteria = id = 'NW'

Тогда я проверяю этот столбец, если это не ноль,

If IsNull(dataSet!col1) Then

Если найдено значение NULL, я использую 'sCriteria = id =' NW ', иначе я использую id =' NW 'и mp <>' N '.

отлично работает. Как было указано, проблема была вызвана нулем.

0 голосов
/ 02 ноября 2010

Страж MoveFirst с проверкой работоспособности, подобной этой:

If Not rs.EOF Or Not rs.BOF Then
    rs.MoveFirst
End If
...