VB 6, ADO, Access - изменение одного поля в БД и бац ...

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Юра П
Новичок
Новичок
 
Сообщения: 29
Зарегистрирован: 23.12.2004 (Чт) 22:44

VB 6, ADO, Access - изменение одного поля в БД и бац ...

Сообщение Юра П » 13.02.2005 (Вс) 14:28

Есть прога, которая связана с БД Access через ADO.

Задача: поменять в БД в записи с нужным номером (sID), только одно поле (hiden=true).

БД состоит из нескольких столбцов.
Вначале я нахожу запись в БД, в которой я хочу поменять только один столбец:
Set Rs = New ADODB.Recordset
Rs.ActiveConnection = conect
rs.Source = "select * from GOODS where ID="+sID 'пробовал писать вместо звезды hiden
rs.CursorType = adOpenDynamic
rs.CursorLocation = adUseClient
rs.LockType = adLockOptimistic
rs.Open
Так вот когда я программно меняю один из столбцов (rs!hiden=true), а после этого обновляю (rs.refresh). Во время обновления и возникает ошипочка:
Key column information is insufficient or incorrect. Too many rows were affected by update.

В чем причина непонятно. Вообще в БД не было ключевых полей и индесов, но я пробовал делать ключевые поля, индексы, все равно таже ошипочка.

В результате я делаю так:
Нахожу запись, запоминаю все ее поля, а после этого удаляю ее и вставляю новую запись (rs.addnew) с теме же полями и плюс нужное мне поле.

Но ведь это криво. Ведь сколько приходиться делать дополнительных операций.
Подскажите пожалуйсто как правильно решить эту пробему.
Последний раз редактировалось Юра П 14.02.2005 (Пн) 23:24, всего редактировалось 1 раз.

snov
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 176
Зарегистрирован: 28.11.2003 (Пт) 10:12
Откуда: Челябинск

Re: VB 6, ADO, Access - изменение одного поля в БД и бац ...

Сообщение snov » 13.02.2005 (Вс) 15:21

Юра П писал(а):Есть прога, которая связана с БД Access через ADO.

Задача: поменять в БД в записи с нужным номером (sID), только одно поле (hiden=true).
Попробуй так:
db.Execute "Update <Имя таблицы> Set hiden=False Where ID=" & sID
P.S. Юзь "&" в работе со строками проще

Юра П
Новичок
Новичок
 
Сообщения: 29
Зарегистрирован: 23.12.2004 (Чт) 22:44

Сообщение Юра П » 13.02.2005 (Вс) 16:23

snov, большое спасибо за ответ.

С update действительно проще. :D

P.S. А вот чем проще амперсант по сравнению с плюсом я не совсем понял.

snov
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 176
Зарегистрирован: 28.11.2003 (Пт) 10:12
Откуда: Челябинск

Сообщение snov » 14.02.2005 (Пн) 7:47

Юра П писал(а):А вот чем проще амперсант по сравнению с плюсом я не совсем понял.
Амперсант проводит неявное преобразование типа к текстовому

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

Сообщение Andrey Fedorov » 14.02.2005 (Пн) 9:15

С update действительно проще.


Да ничем оно не проще.

У тебя должна работать конструкция вида

Код: Выделить всё
Set Rs = New ADODB.Recordset
Rs.ActiveConnection = conect
rs.Source = "select * from where ID="+sID
rs.CursorType = adOpenStatic
rs.CursorLocation = adUseClient
rs.LockType = adLockOptimistic
rs.Open
rs!hiden = True
rs.Update


Если не работает а кричит, как ты говоришь:

Key column information is insufficient or incorrect. Too many rows were affected by update.


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

snov
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 176
Зарегистрирован: 28.11.2003 (Пт) 10:12
Откуда: Челябинск

Сообщение snov » 14.02.2005 (Пн) 9:33

Andrey Fedorov писал(а):
С update действительно проще.


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

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

Сообщение Andrey Fedorov » 14.02.2005 (Пн) 10:28

[/quote]Я лично все таки придерживаюсь идей о том что при работе с базой нужно при возможности переность обработку чего либо на сервер, а не обрабатывать на клиентом[/quote]

Интересно, а как ты в данном случае сделаешь обновление поля на клиенте? При редактировании Recordset-а провайдер все одно отправит серверу запрос на обновление. В одном случае ты формируешь этот запрос сам - в другом провайдер. Я же вполне доверяю провайдеру.

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

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

Сообщение Konst_One » 14.02.2005 (Пн) 12:41

господа, по-моему автор забыл имя таблицы в запросе указать и все :D

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

Сообщение Andrey Fedorov » 14.02.2005 (Пн) 12:42

Konst_One писал(а):господа, по-моему автор забыл имя таблицы в запросе указать и все :D


Ну и это тоже ;)
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

snov
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 176
Зарегистрирован: 28.11.2003 (Пт) 10:12
Откуда: Челябинск

Сообщение snov » 14.02.2005 (Пн) 13:12

Andrey Fedorov писал(а):... А все из-за того что ручками запрос сформирован неправильно, так как ID однозначно не определяет запись.
Как это ID однозначно не определяет запись? А как же первичные ключи и все такое?! Насколько я понял ID - является первичным ключом, как раз с целью однозначного идентифицирования кортежа в таблице!

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 14.02.2005 (Пн) 13:24

Поле ID является тем, чем его сделает разработчик БД.
В данном конкретном случае, судя по тексту ошибки. - это явно не Primary Key.

Юра П
Новичок
Новичок
 
Сообщения: 29
Зарегистрирован: 23.12.2004 (Чт) 22:44

Сообщение Юра П » 14.02.2005 (Пн) 23:20

Коnst_one, Andrey Fedorov обижаете :(
господа, по-моему автор забыл имя таблицы в запросе указать и все


Если бы я забыл указать имя таблицы, то вывелось бы сообщение.
Syntax error in FROM clause. ( Я только что попробовал так сделать.)

А в вопросе я забыл указать имя таблицы не помню даже почему. :oops:
Я в вопросе уже исправил.

Амперсант проводит неявное преобразование типа к текстовому


snov, спасибо, что разъяснил преимущество амперсанта. Я не знал такого прикола. Буду теперь юзать.

Sedge, писал
Поле ID является тем, чем его сделает разработчик БД.
В данном конкретном случае, судя по тексту ошибки. - это явно не Primary Key.


Да, совершенно верно, я же об этом писал в вопросе:

Вообще в БД не было ключевых полей и индесов, но я пробовал делать ключевые поля, индексы, все равно таже ошипочка.


Andrey Fedorov, писал:

Значит так и есть и тебе нужно разбираться со структурой твоей таблицы. Причина указана собственно в сообщении.


Хорошо, переводим сообщение:

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

Вторая часть - слишком много строк было задействовано.
В моем случае обновлялся один столбец и одна строка. Я не думаю, что это много (не то что слишком).

При этом у меня при работе с другой таблицей, обновление происходит нормально.
Единственно, что я думаю, может быть дело в том, что таблица у меня очень большая - 13 столбцов разных типов. (13 число несчастливое)

Вариант, который предложил snov рабочий и это главное, а в чем причина конечно интересно, но остается только догадываться. :?:

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

Сообщение Andrey Fedorov » 15.02.2005 (Вт) 8:22

Вариант, который предложил snov рабочий и это главное, а в чем причина конечно интересно, но остается только догадываться.


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

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

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Re: VB 6, ADO, Access - изменение одного поля в БД и бац ...

Сообщение codemaster » 15.02.2005 (Вт) 12:24

Юра П писал(а): rs.Source = "select * from GOODS where ID="+sID 'пробовал писать вместо звезды hiden

Во время обновления и возникает ошипочка:
Key column information is insufficient or incorrect. Too many rows were affected by update.



Сколько записей возвращает запрос
Код: Выделить всё
rs.Source = "select * from GOODS where ID="+sID


в твоей таблице? :wink: [/code]
//<-
Mit freundlichen Grüßen
//->

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 16.02.2005 (Ср) 12:26

Важно не сколько записей вернет этот запрос, а содержит ли результат этого запроса одинаковые записи. Если да, то как раз такая ошибка и будет.

Более того, это скорее не ошибка, а предупреждение, поскольку изменение уже проведено.
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList