Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SQL Server через ADO в С++ Builder 5.0  [new]
Vladimir S.
Member

Откуда: Gomel.by
Сообщений: 73
народ как улучшить это:

ProgressBar1->Max = List_tmp->Count-6;
for (i = 0,counter = 0;i < List_tmp->Count-6;i++)
{
Query = "INSERT INTO temp_store(Rec_type,CategA,PhoneA,PhoneB,CallDateTime,CallLength,TarCount,DVOServ,DVOType,Indicat,NotUsed,BeamIn,BeamOut,ISDN) values(";
str = List_tmp->Strings[i];
// Rec_type
token = strtok(str.c_str(),"|");
str = token;
Query += str;

// CategA
token = strtok(NULL,"|");
str = token;
Query += ",'"+str+"'";

// PhoneA
token = strtok(NULL,"|");
str = token;
Query += ","+str;

// PhoneB
token = strtok(NULL,"|");
str = token;
Query += ","+str;

// формирование Даты
token = strtok(NULL,"|");
str = token;
day = str.SubString(1,2);
month = str.SubString(3,2);

// формирование Времени
token = strtok(NULL,"|");
str = token;
hour = str.SubString(1,2);
minute = str.SubString(3,2);
sec = str.SubString(5,2);
Query += ",'2003"+month+day+" "+hour+":"+minute+":"+sec+"'";

// CallLength
token = strtok(NULL,"|");
str = token;
Query += ","+str;

// TarCount
token = strtok(NULL,"|");
str = token;
Query += ","+str;

// DVOServ
token = strtok(NULL,"|");
str = token;
Query += ","+str;

// DVOType
token = strtok(NULL,"|");
str = token;
Query += ","+str;

// Indicat
token = strtok(NULL,"|");
str = token;
Query += ","+str;

// формирование NotUsed
token = strtok(NULL,"|");
str = token;
Query += ","+str;

// формирование BeamIn
token = strtok(NULL,"|");
str = token;
Query += ",'"+str+"'";

// формирование BeamOut
token = strtok(NULL,"|");
str = token;
Query += ",'"+str+"'";

// формирование ISDN
token = strtok(NULL,"|");
str = token;
Query += ","+str+")";

// добавление данных в БД
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add(Query);
ADOQuery1->ExecSQL();
if( --counter <= 0 )

{
counter = 1000;
Application->ProcessMessages();
ProgressBar1->Position += 1000;
}
}

медленно пашет

да и как включить транзакции ?
15 май 03, 17:23    [200121]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server через ADO в С++ Builder 5.0  [new]
ziktuw
Member

Откуда:
Сообщений: 3552
Не по одному инсерту посылать на сервер, а по 1000 инсертов одним запросом.
15 май 03, 17:33    [200143]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server через ADO в С++ Builder 5.0  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Я так понял, что идет закачка в базу текстовой информации с разделителями? Если так, то есть BULK INSERT и bcp.
15 май 03, 18:40    [200282]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server через ADO в С++ Builder 5.0  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
пиши так :


TCursor saveCursor = Screen->Cursor;
Screen->Cursor = crSQLWait;


String sql_cmd = "SELECT * FROM nlist WHERE ID=" + String(id_list);
TADOQuery *rec = base->wquery;

rec->Close();
rec->SQL->Clear();
rec->SQL->Add( sql_cmd );
rec->Open();
rec->First();

if( rec->Eof )
{
for(int row = 1; row <= grid->Rows; row++)
{
int order = grid->DisplayRownr[row];
try
{
rec->Append();
rec->Fields->FieldByName(ATTR_TAG_ID)->AsInteger = id_list;
rec->Fields->FieldByName(ATTR_TAG_SID)->AsString = lstImage[row-1].id;
rec->Fields->FieldByName(ATTR_TAG_Num)->AsInteger = order;
rec->Post();
}catch(...){}
}
}

Screen->Cursor = saveCursor;



скорость вырастет в разы
15 май 03, 22:20    [200395]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server через ADO в С++ Builder 5.0  [new]
Vladimir S.
Member

Откуда: Gomel.by
Сообщений: 73
pkarklin - немогу, т.к. у меня в таблице куча индексов :)

Lepsik - а как это будет работать с INSERT а не с SELECT
мне надо добавлять в базу, а не изымать
16 май 03, 00:28    [200468]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server через ADO в С++ Builder 5.0  [new]
hardsql
Member

Откуда:
Сообщений: 45
[srcINSERT INTO temp_store(Rec_type,CategA, ...)
SELECT 'a','b' UNION ALL -- итерация цикла 1
SELECT 'c','d' UNION ALL -- итерация цикла 2
...
SELECT 'y','z' -- итерация цикла N
[/src]

затем
ADOQuery1->SQL->Add(Query);
ADOQuery1->ExecSQL();
16 май 03, 00:46    [200477]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server через ADO в С++ Builder 5.0  [new]
Vladimir S.
Member

Откуда: Gomel.by
Сообщений: 73
Dankov - не 1000 сразу тяжко, он пока забъёт память таким кол-вом запросов, память кончается :)
я поставил посылку каждых 100 запросов, стало быстрее

hardsql - поясни, я не понял
16 май 03, 01:05    [200492]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server через ADO в С++ Builder 5.0  [new]
hardsql
Member

Откуда:
Сообщений: 45

Query="INSERT temp_store(Rec_type,CategA,PhoneA,PhoneB)\n";

for (i = 0,counter = 0;i < List_tmp->Count-6;i++)
{
Query += ((i=0)?"":"UNION ALL\n")+"SELECT ";
str = List_tmp->Strings[i];
// Rec_type
token = strtok(str.c_str(),"
|");
str = token;
Query += str;
// CategA
token = strtok(NULL,"
|");
str = token;
Query += "
,'"+str+"'";
// PhoneA
token = strtok(NULL,"
|");
str = token;
Query += "
,"+str;
// PhoneB
token = strtok(NULL,"
|");
str = token;
Query += "
,"+str;
// e.t.c.
}

ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add(Query);
ADOQuery1->ExecSQL();
16 май 03, 01:21    [200498]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server через ADO в С++ Builder 5.0  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
2 Vladimir S.

немогу, т.к. у меня в таблице куча индексов

Я не понял, какие ограничения накладывает наличие индексов на использование BULK INSERT???
16 май 03, 08:15    [200544]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server через ADO в С++ Builder 5.0  [new]
Vladimir S.
Member

Откуда: Gomel.by
Сообщений: 73
pkarklin - в инструкции к bcp.exe написано, что можно использовать, только если в таблице нет индексов
16 май 03, 12:13    [200936]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server через ADO в С++ Builder 5.0  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
в инструкции к bcp.exe написано, что можно использовать, только если в таблице нет индексов

Можно цитату привести. Что-то я не припоминаю. В BOL сказано, что если закачивается очень большие объемы данных, то рекомендуется удалить индесы, закачать данные и пересоздать индексы. И это действительно быстрее, чем закачивать при наличие индексов. Но других ограничений на счет индексов я не знаю.
16 май 03, 12:57    [201041]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server через ADO в С++ Builder 5.0  [new]
Vladimir S.
Member

Откуда: Gomel.by
Сообщений: 73
hardsql -
на

Query += ((i=0)?"":"UNION ALL\n")+"SELECT ";

пишет:
[C++ Warning] Unit1.cpp(111): W8060 Possibly incorrect assignment
[C++ Error] Unit1.cpp(111): E2085 Invalid pointer addition
что-то не то
16 май 03, 14:14    [201187]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server через ADO в С++ Builder 5.0  [new]
olden69
Member

Откуда: Киев
Сообщений: 169

Query += ((i==0)?"":"UNION ALL\n")+"SELECT ";
16 май 03, 14:24    [201203]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server через ADO в С++ Builder 5.0  [new]
Vladimir S.
Member

Откуда: Gomel.by
Сообщений: 73
Query += ((i==0)?"":"UNION ALL\n")+"SELECT ";
C++ Error] Unit1.cpp(111): E2085 Invalid pointer addition
когда жму на ошибку, курсор переходит между плюслом и "Select ";
16 май 03, 15:46    [201351]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server через ADO в С++ Builder 5.0  [new]
hardsql
Member

Откуда:
Сообщений: 45
>Query += ((i==0)?"":"UNION ALL\n")+"SELECT ";
>C++ Error] Unit1.cpp(111): E2085 Invalid pointer addition
>когда жму на ошибку, курсор переходит между плюслом и "Select ";

Самое простое:

Query += (i==0)?"":"UNION ALL\n";
Query += "
SELECT";

Это проблема с типами: попытка сложить два указателя (char *).
16 май 03, 16:29    [201441]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить