поиск в бд

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Chuvak
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 102
Зарегистрирован: 11.03.2003 (Вт) 8:39
Откуда: Russia, Ozёrsk

поиск в бд

Сообщение Chuvak » 14.07.2003 (Пн) 6:54

из VB работаю с БД (DAO):
перед добавлением новых данных надо определить, существует ли запись в базе. Если нет, то добавить, а если да, то изменить существующую запись. В базе есть ключевое поле.

Alex404
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 109
Зарегистрирован: 22.09.2002 (Вс) 10:58

Сообщение Alex404 » 14.07.2003 (Пн) 7:54

SQL="SELECT Поле FROM Таблица WHERE Поле=ЗначениеКотороеТыТамПроверяешь" (если оно текстовое то ".....FROM Поле=' & ЗначениеКотороеТыТамПроверяешь & "' ;"

Set RS = База.OpenRecordset (SQL)

If RS.Recordcount >0 Then
Изменяешь запись
else
Добавляешь
End if

Chuvak
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 102
Зарегистрирован: 11.03.2003 (Вт) 8:39
Откуда: Russia, Ozёrsk

Сообщение Chuvak » 14.07.2003 (Пн) 10:05

Код: Выделить всё
If RS.Recordcount >0 Then

а если число записей сразу > 0 ? и дальше надо определять как описано в проблеме. в цикле перебирать все записи и сравнивать с нужной - это плохой выход. долженн же быть какой-нибудь sql-запрос или я ошибаюсь?

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 14.07.2003 (Пн) 10:48

Число записей будет >0 только если существует поле, которое ты ищешь. Иначе открытый рекордсет будет пуст.

Alex404
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 109
Зарегистрирован: 22.09.2002 (Вс) 10:58

Сообщение Alex404 » 14.07.2003 (Пн) 11:13

а если число записей сразу > 0 ?

Чето я чегото не понимаю...
У тебя есть таблица с ключевым (неповторяющимся) полем и еще, надо полагать, несколькими полями. Правильно?.
1.Ты проверяешь значения ключевого поля? Если "ДА" то у тебя RS.Recordcount будет или 0 (если токого значения нет), или 1 (если такое значение есть).
2. Если ты проверяшь значение не ключевого поля, но повторяющихся значений там нет, то RS.Recordcount >1 - тоже невозможен в принципе.
3.Если ты проверяшь значение не ключевого поля, и оно допускает ввод повторяющихся значений, и эти значения (повторяющиеся) уже есть, тогда я не понял с чего это ты решил бороться с этими повторениями коли они уже есть...

Или я чего-то еще не понял... :?:

Chuvak
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 102
Зарегистрирован: 11.03.2003 (Вт) 8:39
Откуда: Russia, Ozёrsk

Сообщение Chuvak » 14.07.2003 (Пн) 11:39

понял свою ошибку, всё работает правильно

Chuvak
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 102
Зарегистрирован: 11.03.2003 (Вт) 8:39
Откуда: Russia, Ozёrsk

Сообщение Chuvak » 14.07.2003 (Пн) 12:07

ещё вопрос:
если мне надо удалить запись, ключевое поле которой хранится, например, в переменной N, то как это осуществить?

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 14.07.2003 (Пн) 12:12

Код: Выделить всё
dim conn as new adodb.connection
conn.connectionstring = <...> 'строка подключения к базе
conn.execute "DELETE FROM MyTable WHERE MyKeyField = " & N

Chuvak
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 102
Зарегистрирован: 11.03.2003 (Вт) 8:39
Откуда: Russia, Ozёrsk

Сообщение Chuvak » 14.07.2003 (Пн) 12:33

Код: Выделить всё
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim sSQL As String

Set db = DAO.OpenDatabase(App.Path & "\cfg.mdb")
sSQL = "SELECT * FROM TableData WHERE key =  " & N
Set rs = db.OpenRecordset(sSQL)


выдаёт ошибку:
Ошибка синтаксиса (пропущен оператор) в выражении запроса 'key = 4rgvv32w'

а чё не так?

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 14.07.2003 (Пн) 12:49

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

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.07.2003 (Пн) 13:21

Коряво через запрос.
Лучше заведи в таблице индекс по полю, в котором идет сравнение. Если это только ключевое поле и оно уже проиндексировано, то идешь дальше.
Открываешь рекордсет как Table
Код: Выделить всё
Set db = ...
Set rs = db.OpenRecordset("TableData",,dbOpenTable)

А затем используешь такой код:
Код: Выделить всё
rs.Index="PrimaryKey"
rs.Seek "=", sKeyValue
If rs.NoMatch Then
  rs.AddNew
  ...
  rs.Update
End If
Lasciate ogni speranza, voi ch'entrate.


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

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

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

    TopList