Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Построение INSERTa в ADO, Построение INSERTa в ADO  
:(
    Опции темы
RayR
  Дата 29.5.2007, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 23.5.2007

Репутация: нет
Всего: нет



Вот кусок кода:

Код

char *file_path=OpenDialog1->FileName.c_str();
int j=0;
unsigned int last_position = 0;
static char sb[4096];
static char time[15], duration[6], ip_adr[64], squid_result_code[64], http_status[4],
bytes[10], request_method[64], url[1024], user_name[64], hierarchy_code[64], host[1024], type[64];
FILE *log = fopen(file_path, "r");
if (last_position) fseek(log, last_position, SEEK_SET);
CGauge1->Progress=0;
CGauge1->MaxValue=i;
while (fgets(sb, sizeof(sb), log))
{sscanf(sb, "%s %s %s %[A-Z_]/%s %s %s %s %s %[A-Z_]/%s %s",time, duration, ip_adr,
squid_result_code, http_status, bytes, request_method, url, user_name, hierarchy_code, host, type);
CGauge1->Progress=j+1;
j++;
ADOQuery1->SQL->Text="INSERT INTO PLAData VALUES (' "+ time + " ','duration','ip_adr','squid_result_code','http_status','bytes','request_method','url','user_name','hierarchy_code','host','type')";
ADOQuery1->ExecSQL();


При компиляции говорит "Invalid pointer adition". 
Что я делаю не так? В Delphi такое простое добавление проходит, а здесь... smile 
PM MAIL   Вверх
dizzy1984
Дата 30.5.2007, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: нет
Всего: 25



В си/си++ строка не является элементарным типом, поэтому конкатенацию строк нужно выполнять с помощью функции.
Скажем strcat.
Либо перегруженных операторов + для класса строки.
Можно переписать 
Код

static char time[15]

Код

AnsiString time;

Тогда код должен заработать
PM MAIL   Вверх
dumb
Дата 30.5.2007, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: нет
Всего: 158



RayR, с таким подходом ты апокалипсиса дождешься быстрее, чем твой код на 150-мегах отработает... smile
инсертить надо пачками, причем побольше... да еще и прогресс-индикатор на каждой строке дергать - негоже.

вобщем, вот тебе набросок:
Unit1.h:
Код

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ADODB.hpp>
#include <DB.hpp>
#include <Dialogs.hpp>
#include "CGAUGES.h"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TButton *Button1;
    TMemo *Memo1;
    TADOQuery *ADOQuery1;
    TOpenDialog *OpenDialog1;
    TCGauge *CGauge1;
    void __fastcall Button1Click(TObject *Sender);
private:    // User declarations
public:        // User declarations
    __fastcall TForm1(TComponent* Owner);

    int RecordsPerInsert;
    unsigned int __fastcall ImportLogFromFile(AnsiString AFileName);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


Unit1.cpp:
Код

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <stdio.h>
#include <DateUtils.hpp>

#include "Unit1.h"
//---------------------------------------------------------------------------

struct TSquidLogRecord
{
  char  time[32],
        duration[32],
        ip_adr[64],
        squid_result_code[64],
        http_status[4],
        bytes[16],
        request_method[64],
        url[1024],
        user_name[64],
        hierarchy_code[64],
        host[1024],
        type[64];
};
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CGAUGES"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
  RecordsPerInsert = 100;
}
//---------------------------------------------------------------------------

unsigned int __fastcall TForm1::ImportLogFromFile(AnsiString AFileName)
{
  static char sb[4096];
  static TSquidLogRecord sr;
  FILE *log = fopen(AFileName.c_str(), "r");
  if (!log) return -1;
  fseek(log, 0, SEEK_END); // ставим указатель в конец файла
  unsigned int LogFileSize = ftell(log); // узнаем позицию указателя
  fseek(log, 0, SEEK_SET); // ставим указатель на начало файла
  TDateTime start = Now();
  //TInsertCache *ic = new TInsertCache(ADOQuery1, RecordsPerInsert);
  TStringList *InsertCache = new TStringList();
  InsertCache->Add("INSERT INTO PLAData VALUES");
  CGauge1->Progress = 0;
  CGauge1->MaxValue = 100;
  unsigned int RecCount = 0, ProcessedSize = 0;
  while (fgets(sb, sizeof(sb), log))
  {
    sscanf(sb, "%s %s %s %[A-Z_]/%s %s %s %s %s %[A-Z_]/%s %s",
               sr.time, sr.duration, sr.ip_adr, sr.squid_result_code, sr.http_status,
               sr.bytes, sr.request_method, sr.url, sr.user_name, sr.hierarchy_code, sr.host, sr.type);
    RecCount++;
    ProcessedSize += strlen(sb);
    AnsiString s;
    s.printf("%c('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')",
             (InsertCache->Count > 1 ? ',' : ' '),
             sr.time,sr.duration,sr.ip_adr,sr.squid_result_code,sr.http_status,sr.bytes,
             sr.request_method,sr.url,sr.user_name,sr.hierarchy_code,sr.host,sr.type);
    InsertCache->Add(s);
    if (InsertCache->Count - 1 == RecordsPerInsert)
    {
      ADOQuery1->SQL = InsertCache;
      ADOQuery1->ExecSQL();
      int InsCount = LogFileSize / (ProcessedSize / RecCount) / RecordsPerInsert;
      if (CGauge1->MaxValue != InsCount) CGauge1->MaxValue = InsCount;
      CGauge1->Progress++;
      Application->ProcessMessages();
      InsertCache->Clear();
      InsertCache->Add("INSERT INTO PLAData VALUES");
    }
  }
  if (InsertCache->Count > 1)
  {
    ADOQuery1->SQL = InsertCache;
    ADOQuery1->ExecSQL();
  }
  CGauge1->Progress = CGauge1->MaxValue;
  delete InsertCache;
  fclose(log);
  int run = MilliSecondSpan(Now(), start);
  ShowMessage( IntToStr(run) + "ms, count=" + IntToStr(RecCount) );
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  if (OpenDialog1->Execute())
  {
    ImportLogFromFile(OpenDialog1->FileName);
  }
}
//---------------------------------------------------------------------------


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C++: Базы данных"
chipset

Данный форум предназначен для обсуждения вопросов прямым образом связанных с C++ и БД. Так, вопросы только по C++ следует задавать в C++:Общие вопросы а вопросы по абстрактным БД в Базах данных или в соответствующих под-форумах.

Благодарим за понимание.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, chipset.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Базы данных | Следующая тема »


 




[ Время генерации скрипта: 0.0488 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.