Расскажите об опциях рекордсета ADODB плиз.
От: maxidroms Россия  
Дата: 18.08.06 10:57
Оценка:
Об ADODB::adModeReadWrite,ADODB::adOpenStatic,ADODB::adLockOptimistic и прочих...

Смысл вопроса в том, что сейчас я использую следущие опции для соединения с БД
ADODB::_ConnectionPtr lpConn;
ADODB::_RecordsetPtr lpRst;

lpConn.CreateInstance(__uuidof(ADODB::Connection));
lpConn->ConnectionTimeout = 10;
lpConn->Mode = ADODB::adModeReadWrite;
lpConn->Open(_bstr_t(strConn), "", "", ADODB::adConnectUnspecified);
lpRst.CreateInstance(__uuidof(ADODB::Recordset));
lpRst->CursorLocation = ADODB::adUseClient;

lpRst->Open(_bstr_t(query),_variant_t((IDispatch*)lpConn,true), ADODB::adOpenStatic, ADODB::adLockOptimistic, ADODB::adCmdText);

Запись в таблицу состоящую из 12 столбцов и 5000 записей, производится около 30 сек... можно ли как нибудь увеличить скорость работы с рекордсетом


Спасибо.

18.08.06 15:58: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Re: Расскажите об опциях рекордсета ADODB плиз.
От: wildwind Россия  
Дата: 18.08.06 12:28
Оценка:
Здравствуйте, maxidroms, Вы писали:

M>Запись в таблицу состоящую из 12 столбцов и 5000 записей, производится около 30 сек... можно ли как нибудь увеличить скорость работы с рекордсетом


Что такое "запись в таблицу"? SQL покажи.
Re[2]: Расскажите об опциях рекордсета ADODB плиз.
От: maxidroms Россия  
Дата: 18.08.06 12:33
Оценка:
W>Что такое "запись в таблицу"? SQL покажи.

ADODB::_ConnectionPtr lpConn;
ADODB::_RecordsetPtr lpRst;

lpConn.CreateInstance(__uuidof(ADODB::Connection));
lpConn->ConnectionTimeout = 10;
lpConn->Mode = ADODB::adModeReadWrite;
lpConn->Open(_bstr_t(strConn), "", "", ADODB::adConnectUnspecified);
lpRst.CreateInstance(__uuidof(ADODB::Recordset));
lpRst->CursorLocation = ADODB::adUseClient;

Так....

//Цикл из 5000 итераций
lpRst->AddNew();
lpRst->Fields->GetItem(bstr_t("ID"))->Value = bstr_t(1);
lpRst->Fields->GetItem(bstr_t("Name"))->Value = bstr_t("test");
....
и так 12 столбцов
lpRst->Update();
//Конец цикла из 5000 итераций

или так...разница не большая

//Цикл из 5000 итераций
lpConn->Execute(_bstr_t("Insert into table...."),0,ADODB::adCmdText);
//Конец цикла из 5000 итераций
Re[3]: Расскажите об опциях рекордсета ADODB плиз.
От: __kain Россия  
Дата: 19.08.06 10:13
Оценка:
Попробуйте UpdateBatch. Не факт что поможет, но в MSDN так обновляют
Re[3]: Расскажите об опциях рекордсета ADODB плиз.
От: wtr  
Дата: 20.08.06 11:49
Оценка:
Здравствуйте, maxidroms, Вы писали:



M>или так...разница не большая


M>//Цикл из 5000 итераций

M>lpConn->Execute(_bstr_t("Insert into table...."),0,ADODB::adCmdText);
M>//Конец цикла из 5000 итераций

Можете попробовать еще так


    ArrayList sql = new ArrayList();

    for (int step=0;step<540;step++)
    {
        sql.Add(String.Format("INSERT INTO tbl1(fld1, fld2) VALUES({0}, 'value {0}')", step));

        if (sql.Count >= 100)
        {
            executeSql(String.Join(";", sql.ToArray(typeof(string)) as string[]));
            sql.Clear();
        }

    }

    if (sql.Count > 0)
        executeSql(String.Join(";", sql.ToArray(typeof(string)) as string[]));


или так

    ArrayList sql = new ArrayList();

    for (int step=0;step<540;step++)
    {
        sql.Add(String.Format("SELECT {0}, 'value {0}'", step));

        if (sql.Count >= 100)
        {
            execSql("INSERT INTO tbl1(fld1, fld2) " + String.Join(" UNION ", sql.ToArray(typeof(string)) as string[]));
            sql.Clear();
        }

    }

    if (sql.Count > 0)
        execSql("INSERT INTO tbl1(fld1, fld2) " + String.Join(" UNION ", sql.ToArray(typeof(string)) as string[]));


создайте новую таблицу tbl1, без индексов, тригеров, констрейнов, и проделаете это на ней. Полученное время, я думаю, будет приблизительно минимальным из достижимых для так сформулированой задачи
Re[4]: Расскажите об опциях рекордсета ADODB плиз.
От: maxidroms Россия  
Дата: 21.08.06 05:02
Оценка:
Здравствуйте, __kain, Вы писали:

__>Попробуйте UpdateBatch. Не факт что поможет, но в MSDN так обновляют



А будет ли безошибочно выполняться код так:

for(int i = 0; i < 5000; i++){
lpRst->AddNew();
lpRst->Fields->GetItem(bstr_t("ID"))->Value = bstr_t(1);
lpRst->Fields->GetItem(bstr_t("Name"))->Value = bstr_t("test");
}
lpRst->UpdateBatch(adAffectAll);


или же lpRst->UpdateBatch(xxx); нужно выполнять на каждой итерации цикла?
Re[5]: Расскажите об опциях рекордсета ADODB плиз.
От: __kain Россия  
Дата: 22.08.06 05:55
Оценка:
Здравствуйте, maxidroms, Вы писали:

M>или же lpRst->UpdateBatch(xxx); нужно выполнять на каждой итерации цикла?


Нет, я запускал обновление после всех добавлений в Recordset. Сработало быстрее чем если добавлять по одной записи
Re[3]: Расскажите об опциях рекордсета ADODB плиз.
От: BAndy Удмуртия birep18.com
Дата: 22.08.06 06:31
Оценка:
Здравствуйте, maxidroms, Вы писали:

M>//Цикл из 5000 итераций

M>lpConn->Execute(_bstr_t("Insert into table...."),0,ADODB::adCmdText);
M>//Конец цикла из 5000 итераций

надо сделать транзакцию
до цикла вызвать begin transaction
после цикла commit
и выполняться будет 0 сек.
Re[4]: Расскажите об опциях рекордсета ADODB плиз.
От: maxidroms Россия  
Дата: 22.08.06 07:56
Оценка:
BA>надо сделать транзакцию
BA>до цикла вызвать begin transaction
BA>после цикла commit
BA>и выполняться будет 0 сек.


Ага. Только надо еще не забыть в цикле вызывать AddNew и Update...я проверил... время равно сильно тому что с BatchUpdate.
Просто транзакция поможет в случае ошибки откатить назад
Re[5]: Расскажите об опциях рекордсета ADODB плиз.
От: BAndy Удмуртия birep18.com
Дата: 24.08.06 04:49
Оценка:
Здравствуйте, maxidroms, Вы писали:

M>Ага. Только надо еще не забыть в цикле вызывать AddNew и Update...я проверил... время равно сильно тому что с BatchUpdate.

M>Просто транзакция поможет в случае ошибки откатить назад

если мы о куске на который я ответил:

M>//Цикл из 5000 итераций

M>lpConn->Execute(_bstr_t("Insert into table...."),0,ADODB::adCmdText);
M>//Конец цикла из 5000 итераций

то не надо никаких AddNew и Update.

И ваще о каком движке мы говорим. Если это Access, то забудь про скорость, не увеличишь.
Если это MS SQL, то я готов носом в клаву тыкать — есть ошибка!
Можешь сделать пример покороче и найдем твою ошибку!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.