запись данных в Excel посредством ADO

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Дмитрий Б.
Сообщения: 56
Зарегистрирован: 05 дек 2007, 18:09

запись данных в Excel посредством ADO

Сообщение Дмитрий Б. » 03 мар 2012, 14:23

Здраствуйте.

Подскажите пожалуйста как можно осуществить запись данных в Excel посредством ADO.
Весь день потратил на поиск информации по этому вопросу, но без результатно.

Извините за вопрос не по тематике форума, но может кто-нибудь подскажет.

Использую С++ Builder 6.0 и стандартные компоненты палитры ADO.
Вот функция которая открывает файл. Здесь все работает без проблем.

Код: Выделить всё

   AnsiString mFile;
   if(OpDlg->Execute())
   {
     mFile = OpDlg->FileName;
     DM->ADOConnection1->Provider=WideString("Microsoft.Jet.OLEDB.4.0");
     DM->ADOConnection1->ConnectionString=WideString("Data Source="+mFile+";Extended Properties='Excel 8.0; 

HDR=No;IMEX=1'");
     DM->ADOConnection1->LoginPrompt=false;
     DM->ADOConnection1->GetTableNames(LBoxTableName->Items,NULL);
     static_cast<TCustomConnection*>(DM->ADOConnection1)->Open();
     DM->ADOQuery1->Connection=DM->ADOConnection1;
     DM->ADOQuery1->SQL->Text="select * from ["+ LBoxTableName->Items->Strings[0] +"]";
     DM->ADOQuery1->Open();
     int ColCnt = DBGrid1->Columns->Count;
     for(int i=0; i<ColCnt; i++)
     {
        TColumn * mCol = new TColumn(DBGrid1->Columns);
        mCol->FieldName = "F" + IntToStr(i+1);
        mCol->Width = 100;
     }
   }
   LabEdit_Number->SetFocus();
   if(!DM->ADOConnection1->Connected)
      ShowMessage("Ошибка  открытия файла");
Эта функция производит поиск введенной в LabelEdit строки в файле Эксель.
Тоже все без проблем.

Код: Выделить всё

   if(DM->ADOConnection1->Connected)
   {
      if(LabEdit_Number->Text != "")
        DM->ADOQuery1->SQL->Text="select * from ["+ LBoxTableName->Items->Strings[0] +"] where 

F1='"+LabEdit_Number->Text+"'";
      else
        DM->ADOQuery1->SQL->Text="select * from ["+ LBoxTableName->Items->Strings[0] +"]";
      DM->ADOQuery1->Open();
      int ColCnt = DBGrid1->Columns->Count;
      for(int i=0; i<ColCnt; i++)
      {
          TColumn * mCol = new TColumn(DBGrid1->Columns);
          mCol->FieldName = "F" + IntToStr(i+1);
          mCol->Width = 100;
      }
   }
   else
   {
      ShowMessage("Необходимо открыть файл.");
      PMOpen1->Click();
   }
А вот здесь начинаються непонятки.

Код: Выделить всё

   DM->ADOQuery1->Close();
   DM->ADOQuery1->SQL->Clear();    
//======= ВАРИАНТ №1 =========================
   DM->ADOQuery1->SQL->Add("update ["+ LBoxTableName->Items->Strings[0] +"] set F3=:F3 where F1=:F1");
   DM->ADOQuery1->Parameters->ParamByName("F1")->Value = LabEdit_Number->Text;
   DM->ADOQuery1->Parameters->ParamByName("F3")->Value = LabEdit_Count->Text;
//============================================
//======= ВАРИАНТ №2 =========================
   DM->ADOQuery1->SQL->Add("update ["+ LBoxTableName->Items->Strings[0] +"] set F3='"  + LabEdit_Count->Text +  "' where 

F1='"+ LabEdit_Number->Text+ "'");
//============================================
//======= ВАРИАНТ №3 =========================
//==== (от безисходности начал тупо экспериментировать)=======
   DM->ADOQuery1->SQL->Add("update ["+ LBoxTableName->Items->Strings[0] +"] set F3 values('" + LabEdit_Count->Text+ "') 

where F1='"+ LabEdit_Number->Text+ "'");
//============================================
   DM->ADOQuery1->ExecSQL();
содержимое DM->ADOQuery1->SQL->Text:
В ВАРИАНТе №1 - update [TDSheet$] set F3=:F3 where F1=:F1
В ВАРИАНТе №2 - update [TDSheet$] set F3='10' where F1='28113-2F000'
В ВАРИАНТе №3 - update [TDSheet$] set F3 values('10') where F1='28113-2F000'

Текст Ошибки:
В ВАРИАНТе №1 - ...raise exception class EOleException with message 'В операции должен использоваться обновляемый запрос'.

Process stopped.
В ВАРИАНТе №2 - ...raise exception class EOleException with message 'В операции должен использоваться обновляемый запрос'.

Process stopped.
В ВАРИАНТе №3 - Ошибка синтаксиса в инструкции UPDATE --- И не сомневался в этом

Не понятно, почему не работает Вариант №1. В другой программе при работе с Interbase все ОК - только вместо ADOQuery1 там используется IBDataSet и также все через параметры.

И также непонятно 'В операции должен использоваться обновляемый запрос' - пытался поискать в инете про это, но все написано как-то "в общем" - тоже не понял ничего.

Может кто-нибудь подскажет как эту проблему можно решить и что такое обновляемый запрос (впервые такое слышу)?

С Уважением, Дмитрий.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: запись данных в Excel посредством ADO

Сообщение kdv » 03 мар 2012, 21:43

вы правы - вопрос не имеет абсолютно никакого отношения к тематике форума, так что через пару дней я этот топик удалю.
С вопросом обратитесь в соответствующий раздел форумов sql.ru (и не в раздел про InterBase и Firebird, разумеется).

Вдогонку - не стоит считать ADO и IBX идентичными. У них есть свои отличия. Поэтому то, что работает с IBDataSet, не обязано работать с ADO, и наоборот.

Дмитрий Б.
Сообщения: 56
Зарегистрирован: 05 дек 2007, 18:09

Re: запись данных в Excel посредством ADO

Сообщение Дмитрий Б. » 05 мар 2012, 11:47

Большое спасибо kdv за наводку.
С Уважением, Дмитрий.

Ответить