Подскажите пожалуйста как можно осуществить запись данных в 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("Ошибка открытия файла");
Тоже все без проблем.
Код: Выделить всё
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();
В ВАРИАНТе №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 и также все через параметры.
И также непонятно 'В операции должен использоваться обновляемый запрос' - пытался поискать в инете про это, но все написано как-то "в общем" - тоже не понял ничего.
Может кто-нибудь подскажет как эту проблему можно решить и что такое обновляемый запрос (впервые такое слышу)?
С Уважением, Дмитрий.