Ошибка при удалении строки

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
bvv70
Обычный пользователь
Обычный пользователь
 
Сообщения: 55
Зарегистрирован: 22.04.2006 (Сб) 19:12

Ошибка при удалении строки

Сообщение bvv70 » 29.11.2006 (Ср) 14:49

Помогите вот в каком вопросе. В DataGrid при удалении строки:
Код: Выделить всё
Private Sub cmdDelete_Click()
On Error GoTo DeleteErr
With datPrimaryRS.Recordset
.Delete
.MoveNext
If .EOF Then .MoveLast
End With
Exit Sub
DeleteErr:
MsgBox Err.Description
End Sub

возникает ошибка «Heдocтaтoчныe или нeпoлныe cвeдeния o ключeвoм пoлe. Oбнoвлeниe влияeт нa cлишкoм бoльшoe чиcлo cтpoк». Как я понял, порывшись в инете виной тому пустые ячейки в некоторых столбцах. Что делать? Использовать DAO, где вроде бы допускается наличие пустых полей, не желательно.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 29.11.2006 (Ср) 15:04

и как вы это запускаете?

bvv70
Обычный пользователь
Обычный пользователь
 
Сообщения: 55
Зарегистрирован: 22.04.2006 (Сб) 19:12

Сообщение bvv70 » 29.11.2006 (Ср) 15:41

На форме размещен Adods (datPrimaryRS) связанный с базой Access и DataGrid. Добавление строк
Код: Выделить всё
datPrimaryRS.Recordset.AddNew
datPrimaryRS.Recordset.Fields("Наименование операции") = cmbOperaziy2.Text
‘ ни и так далее, затем:
datPrimaryRS.Recordset.UpdateBatch adAffectAll

Причем некоторые ячейки в базе пустые. При попытке удаления строки вышеприведенным способом выдается ошибка.

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 29.11.2006 (Ср) 15:41

тебе нужно чтобы в запрос было включено поле с автоинкриментом
тогда ошибка пропадет
Теория - это когда что-то не работает и известно почему.
Практика - это когда что-то работает, но неизвестно почему.
Нам удалось совместить теорию с практикой, теперь ничего не работает и неизвестно почему.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 29.11.2006 (Ср) 15:42

Во-первых лучше сделать
Код: Выделить всё
If .EOF Then If .RecordCount <> 0 Then .MoveLast

Во-вторых рекомендую таки добавить ключевое (или identity) поле в таблицу, если его там нет, и производить выборку вместе с ним. Потому что такая ошибка возникает и тогда, когда набор имеет две и более идентичные записи, не обязательно пустые, и курсор базы не совсем понимает, какую из них нужно удалять/апдейтить.
Лучший способ понять что-то самому — объяснить это другому.

bvv70
Обычный пользователь
Обычный пользователь
 
Сообщения: 55
Зарегистрирован: 22.04.2006 (Сб) 19:12

Сообщение bvv70 » 29.11.2006 (Ср) 16:35

Ключевое поле в таблице есть, а как производить выборку вместе с ним?

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 29.11.2006 (Ср) 16:39

указать данное поле в запросе на выборку данных:

select IdentityField, Field1, ... FROM ...

bvv70
Обычный пользователь
Обычный пользователь
 
Сообщения: 55
Зарегистрирован: 22.04.2006 (Сб) 19:12

Сообщение bvv70 » 30.11.2006 (Чт) 13:59

Понял в чем дело, но не знаю как это исправить. После добавления новой строки не обновляется поле счетчика DataGrid, ну то есть в новой строке в поле счетчика пусто. Если пытаюсь удалить только что созданную строку - ошибка. После добавления провожу обновление
Код: Выделить всё
datPrimaryRS.Recordset.UpdateBatch adAffectAll или datPrimaryRS.Recordset.Update
- значения счетчика не появляются. А вот если перезагружу прогу - значения счетчика появляются и удаление происходит нормально.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 30.11.2006 (Чт) 14:27

Что за база? Как открывается соединение? Как открывается рекордсет? По идее эта инфа должна была быть предоставлена с самого начала.
Лучший способ понять что-то самому — объяснить это другому.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 30.11.2006 (Чт) 14:53

lord0n писал(а):тебе нужно чтобы в запрос было включено поле с автоинкриментом тогда ошибка пропадет


Неправда.

Правильный ответ - в таблице должен быть определен первичный ключ.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

bvv70
Обычный пользователь
Обычный пользователь
 
Сообщения: 55
Зарегистрирован: 22.04.2006 (Сб) 19:12

Сообщение bvv70 » 30.11.2006 (Чт) 16:13

Поясню для начала - VB знаю поверхностно, базы начал осваивать несколько дней назад, поэтому прошу меня извинить, но фраза «в таблице должен быть определен первичный ключ» мне не о чем не говорит. Постараюсь поподробнее: есть база Kniga.mdb из одной таблицы с полями: Дата, Наименование операции, Номер, Доход, Расход, ну и Счетчик. Далее с помощью Data Form Wizard создаю приложение (на форме Adods, кнопки Новая строка, Удалить, Обновить. Затем добавляю DataGrid и указываю свойство DataSourse для связи с базой. Ввод данных осуществляется подобным образом: datPrimaryRS.Recordset.Fields("Доход") = txtFields6.Text, т.е. textbox’ы изначально связанные свойством DataSourse с базы я отключаю для предварительной проверки данных. Может быть путано объяснил... Спасибо за терпение.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 30.11.2006 (Чт) 16:29

bvv70 писал(а):но фраза «в таблице должен быть определен первичный ключ» мне не о чем не говорит.


В конструкторе таблицы Access установи для поля счетчика признак Ключевое поле. Ну ключик чтобы там появился...

P.S А в принципе, Ключевым полем может быть не только счетчик, а и комбинация из нескольких полей...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

bvv70
Обычный пользователь
Обычный пользователь
 
Сообщения: 55
Зарегистрирован: 22.04.2006 (Сб) 19:12

Сообщение bvv70 » 30.11.2006 (Чт) 16:46

У меня Access ХР и базы, создаваемые с его помощью VB не принимает. Я создаю базу в Visual Data Manager. Там как это сделать?

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 30.11.2006 (Чт) 16:50

все VB понимает :!:
не надо юзать контрол Data, а использовать надо ADODB.Recordset

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 30.11.2006 (Чт) 17:13

bvv70 писал(а):У меня Access ХР и базы, создаваемые с его помощью VB не принимает. Я создаю базу в Visual Data Manager. Там как это сделать?


Visual Data Manager расчитан на старые версии баз. Его править нужно - его исходники, кстати, идут в примерах.

Но проще открыть Access-ом уже созданную mdb-шку и поправить им.

А VB понимает все - просто надо указывать в ссылках последние версии DAO/ADO.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 4

    TopList  
cron