Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

поиск в БД   Найти похожие ветки 

 
Scot Storch   (2010-06-04 14:02) [0]

в определенные моменты в программе нужно проверять есть ли в таблице БД запись (по логике может быть только одна либо вообще не быть) со значением X в поле A и значением Y в поле B. Как лучше сделать поиск и проверку: запросом или Locate"ом?


 
Ega23 ©   (2010-06-04 14:07) [1]

select exists + F1


 
aka   (2010-06-04 14:07) [2]


> со значением X в поле A и значением Y в поле B.

В ХП с возвратом


 
test ©   (2010-06-04 14:38) [3]

БД какая?


 
Sergey13 ©   (2010-06-04 14:48) [4]

> [1] Ega23 ©   (04.06.10 14:07)

Exists тут имхо ни к чему.
Просто select и проверка вернуло ли что нибудь или select count(id) и анализ результата.

> [2] aka   (04.06.10 14:07)

На каждый чих, ИМХО, никакого смысла ХП создавать нет.


 
Медвежонок Пятачок ©   (2010-06-04 14:52) [5]

Как лучше сделать поиск и проверку

Лучше сделать констрейнт.
тогда проверять не потребуется, так как будет либо одна, либо не будет


 
oldman ©   (2010-06-04 16:17) [6]


> со значением X в поле A и значением Y в поле B


Вычисляемое поле A+B и индекс по нему.


 
Игорь Шевченко ©   (2010-06-04 17:46) [7]


> Как лучше сделать поиск и проверку: запросом или Locate"ом?


запросом


 
Псалтырь ©   (2010-06-04 23:24) [8]

SELECT 1 FROM table WHERE x = A AND y = B LIMIT 1


 
Sergey13 ©   (2010-06-07 10:03) [9]

> [0] Scot Storch   (04.06.10 14:02)

Строго говоря для однозначного ответа на твой вопрос мало информации.
Если прога однопользовательская и таблица небольшая (+ постоянно вся находится в памяти, типа справочник), то Locate проще и, наверное, быстрее. Если эти условия не соблюдены, то отдельный запрос - более предпочтительное средство узнать правду.


 
12 ©   (2010-06-07 10:57) [10]

Имхо, все на хп надо
потом захочется на VС, на web-лицо перевести

Кстати, покритикуйте метод
...
 if Exists(select ObjectsId from rnrRequest where ObjectsId = @Id)
 begin
   Select 1 as Result, "Невозможно удалить - имеются заявки с этим объектом" as Becouse;
   Return;
 end
 else begin
   delete from rnrObject where IdObject = @Id;  
   Select 0 as Result, "Ok" as Becouse;
 end;

или вот как добавить.
 
ALTER PROCEDURE [dbo].[rnrAddObject]
 @Name_IN varchar(50),
 @Address_IN varchar(50),
 @Id_IN int
AS
BEGIN
 declare @Id int; Set @Id = @Id_IN;                -- сохраним входные
 declare @Name varchar(50); SET @Name = @Name_IN;
 declare @Address varchar(50); SET @Address = @Address_IN;

 SET NOCOUNT ON;
 IF @Id = -999
 BEGIN
   IF (@Address = "") OR (@Address is null)
    INSERT INTO rnrObject (ObjectName) values (@Name);
   ELSE
    INSERT INTO rnrObject (ObjectName, AddressObject) values (@Name, @Address);
   SELECT SCOPE_IDENTITY() as Result, "Ok" as Becouse FROM rnrObject;
 END
 ELSE
 BEGIN
   IF (@Address = "") OR (@Address is null)
    INSERT INTO rnrObject (IdObject, ObjectName) values (@Id, @Name)
   ELSE
    INSERT INTO rnrObject (IdObject, ObjectName, AddressObject) values (@Id, @Name, @Address);
   SELECT SCOPE_IDENTITY() as Result, "Ok" as Becouse FROM rnrObject;
 END;
END

смысл - Любая процедурка после своего испонения вернет Result и Becouse, для расшифровки и показа юзеру, почему не сделано.
Для перевода остается только на соотв.языке переписать внешний вид


 
Sergey13 ©   (2010-06-07 12:03) [11]

> [10] 12 ©   (07.06.10 10:57)
> Кстати, покритикуйте метод
> ...
> if Exists(select ObjectsId from rnrRequest where ObjectsId
> = @Id)
> begin
>   Select 1 as Result, "Невозможно удалить - имеются заявки
> с этим объектом" as Becouse;

Почему нельзя просто констрейнт (FK) поставить?


 
Sergey13 ©   (2010-06-07 12:06) [12]

> [10] 12 ©   (07.06.10 10:57)
> Имхо, все на хп надо

Во первых, не везде есть ХП.
Во вторых, какой смысл на каждый чих создавать объект, за которым надо следить и сопровождать?


 
12 ©   (2010-06-07 12:24) [13]


> Во первых, не везде есть ХП.

ок, правда, где есть - там.


> Во вторых, какой смысл на каждый чих создавать объект,

не известно, что захотят потом. На всякий.
А если не объект в БД, то код в программе - все равно поддерживать


> Почему нельзя просто констрейнт (FK) поставить?

можно, не пробовал, надо попробовать/посмотреть
так просто мне понятно, заодно все делаю однообразно exec БЛАБЛА :параметр
и поля результата понятные - Result и becouse.
все это в отдельной процедуре, в отдельном модуле


 
Petr V. Abramov ©   (2010-06-07 13:23) [14]


> 12 ©   (07.06.10 12:24) [13]
> можно, не пробовал, надо попробовать/посмотреть

if exists и delete выполняются неатомарно, между ними вполне может влезьть insert в rnrRequest из другой транзакции, и ты приплыл. Вероятность этого маленькая вроде бы, но законы Мэрфи имеют приоритет над законами больших чисел, проверено.
А констрейнт все эти гадкие ситуации гарантированно разруливает.


 
Sergey13 ©   (2010-06-07 14:39) [15]

> [13] 12 ©   (07.06.10 12:24)
> А если не объект в БД, то код в программе - все равно поддерживать

Так код программы по любому сопровождать. Я понимаю когда ХП что-то делает независимо от клиента (типа запускает расчет отдающий клиенту одно число), тогда конечно оправдано ее использование. Вот добавилось поле в таблице - клиента практически по любому надо править, а при твоем подходе еще и хрен знает сколько процедур, который связаны с другими процедурами. Легко нарваться на не валидность какой нибудь (например твоей проверочной) и получить гемороя по полной программе.

> можно, не пробовал
Как же ты с БД то работаешь? 8-)


 
Petr V. Abramov ©   (2010-06-07 15:01) [16]


> Sergey13 ©   (07.06.10 14:39) [15]
> Вот добавилось поле в таблице - клиента практически по любому
> надо править

добавилось поле в таблице - по зависимостям словарь запросил, и более-менее понятно, что надо править. А какие формы от таблицы зависят - ищи-свищи.


 
12 ©   (2010-06-07 15:08) [17]


> > можно, не пробовал
> Как же ты с БД то работаешь? 8-)

медленно..
Есть у меня их (FK) - но прежде чем написать что-то сидю, думаю :)
Начальник съест скоро - производительность малая

зато сообщения типа "Невозможно удалить - имеются заявки с этим объектом"
намного лучше для пользователя(он и заявки удалит или откажется удалять объект), чем нарушение какого-то констрейта


 
test ©   (2010-06-07 15:24) [18]

Select 1 as Result, "Невозможно удалить - имеются заявки с этим объектом" as Becouse;

Я бы в случае ошибки взводил исключение, так проще для клиентской части. она получает не нормально отработанную ХП, а ошибку с текстом, даже если у клиента нет обработки ошибок в принципе работать дальше с ошибочными данными он не будет.


 
test ©   (2010-06-07 15:45) [19]

declare @Id int; Set @Id = @Id_IN;                -- сохраним входные
declare @Name varchar(50); SET @Name = @Name_IN;
declare @Address varchar(50); SET @Address = @Address_IN;

В куда и зачем? У тебя есть доступ к переменным, которые передаются при вызове ХП, зачем их дублировать?


 
Sergey13 ©   (2010-06-07 16:31) [20]

> [16] Petr V. Abramov ©   (07.06.10 15:01)
> А какие формы от таблицы зависят - ищи-свищи.

Так один фиг их (эти добавленные поля) надо пользователю показывать, в отчеты выводить и т.п., не просто же так поле добавили. Т.е. хоть ищи хоть свищи, а в код все равно лезьть надо.
Кроме того, как правило, от таблицы напрямую только датамодуль зависит.


 
Игорь Шевченко ©   (2010-06-07 16:35) [21]


> Кроме того, как правило, от таблицы напрямую только датамодуль
> зависит.


Где б найти такое правило...


 
12 ©   (2010-06-07 17:06) [22]


> В куда и зачем? У тебя есть доступ к переменным, которые
> передаются при вызове ХП, зачем их дублировать?

давно кто-то так посоветовал, при отладке смотреть что вошло и что сейчас удобно. И, если процедура, как думаю, будет потом расти - всегда так делаю.

Насчет исключения - в принципе, можно..
Я просто к чему - когда все ХП заканчиваются так
Select ХХХ as Result, "ННННН" as Becouse; - бывает удобно писать общие вещи для всех


 
test ©   (2010-06-07 17:18) [23]

12 ©   (07.06.10 17:06) [22]

Точно так же ты можешь просмотреть и состояние переменных которые передаются, если у тебя несколько дублированных вариантов, сам потом в них путаться будешь. Каким то присвоил новые значения каким то нет.

Если ХП отработала, клиент не знает на сколько корректно были выполнены запросы, чтобы остановить работу или явно указать об ошибке используют исключения.

Допустим отработала ХП запись в бд новых значений, в becouse ошибка, но ее не проверили, программа работает дальше, записывает выполняет какие то действия и собирает вместо 1 уже целый ворох ошибок, никто не гарантирует что в ситуации с прочтением becouse(*словарь и  распозновалка?*) такое не случиться. Просто ИМХО надежнее.

Сам просил покритиковать, тут это легко ))



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.059 c
2-1272357036
oleg_teacher
2010-04-27 12:30
2010.08.27
DateTimePicker2.


15-1270197774
12
2010-04-02 12:42
2010.08.27
Тоже про природу. Объясните феномен.


2-1273835444
Крапивин Олег
2010-05-14 15:10
2010.08.27
Как вывести дату-время в Chart?


15-1268677017
AntonioBanderas
2010-03-15 21:16
2010.08.27
из prn в rtf


2-1270623897
Девушка
2010-04-07 11:04
2010.08.27
Динамическое создание FibQuery как поле класса





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский