Лишний селект пи работе функции?
От: LowCoder  
Дата: 23.12.10 07:26
Оценка:
Подскажите плз такой вопрос, есть у меня программа (на Ц++ но не важно) которая работает с БД (через ADO). И такая ситуация — программа должна проапдейтить запись в таблице но если записи там нет то вставить новую запись. Сейчас мне приходится делать селект и если мол число записей одын то апдейтить запись а если ноль то добавлять новую.
Т.е. сейчас мой код выглядит примерно так



bool foo ( param1 ... )
{
    try {
        ...
        SELECT … FROM …
        ...
        long lRCnt = rsCounters->GetRecordCount();
        
        if( lRCnt == -1 || lRCnt > 1 )        
            return false;
        else if( lRCnt == 0 )                
            rsCounters->AddNew();    

        rsCounters->Fields->Item["field1"]->Value = param1;
        ...
        rsCounters->Update();
        rsCounters->Close();
        return true;
    }
    ADO_CATCH2()
    return false;
}



Но есть у меня внутреннее ощущение продиктованное интуицией и опытом что что-то тут не так (прямо таки внутренний протест — вот что хотите делайте но не так тут энергия Ци течет) и можно это сделать как то красивее или проще? Есть ли более правильные решения? Если спрашивать еще точнее — можно ли обойтись без селекта и если да то как?
Re: Лишний селект пи работе функции?
От: DarkMaster Украина http://www.bdslib.at.ua
Дата: 23.12.10 09:52
Оценка:
Здравствуйте, LowCoder, Вы писали:

LC>Т.е. сейчас мой код выглядит примерно так


LC>Но есть у меня внутреннее ощущение продиктованное интуицией и опытом что что-то тут не так (прямо таки внутренний протест — вот что хотите делайте но не так тут энергия Ци течет) и можно это сделать как то красивее или проще? Есть ли более правильные решения? Если спрашивать еще точнее — можно ли обойтись без селекта и если да то как?



IF EXISTS(SELECT ... FROM ....) THEN UPDATE ... ELSE INSERT .....


и завернуть в хранимую процедуру например + звать ее при необходимости INSERT или UPDATE.
WBR, Dmitry Beloshistov AKA [-=BDS=-]
Re: Лишний селект пи работе функции?
От: Sni4ok  
Дата: 23.12.10 09:57
Оценка:
Здравствуйте, LowCoder, Вы писали:

LCЕсть ли более правильные решения?

replace ?
Re: Лишний селект пи работе функции?
От: Flying Dutchman Украина  
Дата: 23.12.10 10:20
Оценка:
Здравствуйте, LowCoder, Вы писали:

LC>Подскажите плз такой вопрос, есть у меня программа (на Ц++ но не важно) которая работает с БД (через ADO). И такая ситуация — программа должна проапдейтить запись в таблице но если записи там нет то вставить новую запись. Сейчас мне приходится делать селект и если мол число записей одын то апдейтить запись а если ноль то добавлять новую.


Какая БД ? Если Oracle или SQL Server 2005 — 2008, то можно использовать MERGE.
Re[2]: Лишний селект пи работе функции?
От: LowCoder  
Дата: 23.12.10 12:35
Оценка:
Здравствуйте, Flying Dutchman, Вы писали:

FD>Здравствуйте, LowCoder, Вы писали:


LC>>Подскажите плз такой вопрос, есть у меня программа (на Ц++ но не важно) которая работает с БД (через ADO). И такая ситуация — программа должна проапдейтить запись в таблице но если записи там нет то вставить новую запись. Сейчас мне приходится делать селект и если мол число записей одын то апдейтить запись а если ноль то добавлять новую.


FD>Какая БД ? Если Oracle или SQL Server 2005 — 2008, то можно использовать MERGE.


Спасибо ответившим — хранимкм мне не подходят в силу разных причин — гнадо сделать в проге

Очень инетерсный совет дали на мой вопрос (тем кому интерсно)



здесь
Re: Лишний селект пи работе функции?
От: ZAMUNDA Земля для жалоб и предложений
Дата: 23.12.10 14:47
Оценка:
Здравствуйте, LowCoder, Вы писали:

LC>Но есть у меня внутреннее ощущение продиктованное интуицией и опытом что что-то тут не так (прямо таки внутренний протест — вот что хотите делайте но не так тут энергия Ци течет) и можно это сделать как то красивее или проще? Есть ли более правильные решения? Если спрашивать еще точнее — можно ли обойтись без селекта и если да то как?

Ну скажем, можно сразу сделать UPDATE, а если кол-во обновлённых строк равно нулю (В ADO Execute в параметре возвращается), то делать INSERT.
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re[2]: Лишний селект пи работе функции?
От: _d_m_  
Дата: 28.12.10 05:47
Оценка:
Здравствуйте, Flying Dutchman, Вы писали:

FD>Какая БД ? Если Oracle или SQL Server 2005 — 2008, то можно использовать MERGE.


MERGE появился с 2008 версии.
Re: Лишний селект пи работе функции?
От: Oleg Bekhter Украина www.bekhter.net
Дата: 28.12.10 16:09
Оценка:
Здравствуйте, LowCoder, Вы писали:

LC>Подскажите плз такой вопрос, есть у меня программа (на Ц++ но не важно) которая работает с БД (через ADO). И такая ситуация — программа должна проапдейтить запись в таблице но если записи там нет то вставить новую запись. Сейчас мне приходится делать селект и если мол число записей одын то апдейтить запись а если ноль то добавлять новую.

...

LC>Но есть у меня внутреннее ощущение продиктованное интуицией и опытом что что-то тут не так (прямо таки внутренний протест — вот что хотите делайте но не так тут энергия Ци течет) и можно это сделать как то красивее или проще? Есть ли более правильные решения? Если спрашивать еще точнее — можно ли обойтись без селекта и если да то как?

Я делаю так: Тут мой ADO-велосипед, но, думаю, смысл ясен
   CAdoQuery qu( SQL_AtsAccount_Update );
   qu.SetParam( L"[:prefix]",  m_strPrefix );
   qu.SetParam( L"[:account]", m_nAccount  );

   CAdoRecordset rs( m_pDatabase, ADODB::adUseClient, ADODB::adOpenStatic );
   rs.Open( &qu, ADODB::adLockOptimistic );
   if( rs.IsEOF() )
      rs.AddNew();
   else
      rs.Edit();
   rs.Value[m_strFieldName        ] = m_strName;
/* .... */
   rs.Value[m_strFieldCreditAmount] = m_fCreditAmount;
   rs.Update();
   m_nAccount = rs.Value[m_strFieldID].ToLong();
   rs.Close();


Можно merge использовать, но это 2008+ и такая же база
Варианты делать insert, ловить exception, IMHO, потерь больше.
А для update все-равно select нужен...
Best regards,
Oleg Bekhter
Software Developer
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.