Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как вытащить в переменную

1.2K
25 октября 2005 года
richel
142 / / 20.01.2005
После выполнения запроса Insert into... по вставке записей из одной таблицы в другую не получается определить новый уникальный номер вставленных записей в таблицу.
Запрос такой:
Цитата:
TADOCommand *cmtkn = ADOCommand1;
cmtkn->ParamCheck = true;
cmtkn->Prepared = false;

cmtkn->CommandText = AnsiString("") +"\
Insert Into Table1 (old_id, KodSyst, GostID) \n\
Select CardID, KodSyst, GostID \n\
From Table2 \n\
Where CardID in (" + sql_tkn + ") \n\
";
cmtkn->Execute();


У Table1 (куда вставляем) первое поле CardID int //PRIMARY KEY CLUSTERED IDENTITY(1, 1) NOT NULL, вот значения вставленных записей мне и нужно перечислить.
sql_tkn - это номера уникального номера вставляемых записей (с помощью закладок).
Посоветуйте, пожалуйста, что сделать. У меня перечисляется один и тот же номер по числу вставленных строк.

1
25 октября 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by richel

sql_tkn - это номера уникального номера вставляемых записей (с помощью закладок).


???????

Цитата:
Originally posted by richel

Посоветуйте, пожалуйста, что сделать. У меня перечисляется один и тот же номер по числу вставленных строк.


Вызывать процедуру возвращающюю вставленные идентити.

488
27 октября 2005 года
Mоngооsе
465 / / 01.04.2005
Можно попробовать
Код:
if(bookmarks.size()==0)return; //Если не выделено ни одной записи

  TDataSet* gtkn = Grid_Volume->DataSource->DataSet;
  gtkn->DisableControls();

  // Алгоритм копирования
  AnsiString SectorTable = "Loading_Card_Sector"; //Откуда копировать
  AnsiString CardTable = "Loading_Card_21030"; //Куда копировать
  AnsiString SectorBreak = "Loading_Break_Sector"; //Откуда копировать
  AnsiString CardBreak = "Loading_Break_21030"; //Куда копировать

  AnsiString str;

  TADOQuery *qry = ADOQuery1; // нужно поместить компонент на форму и
                              // настроить
  int crno = gtkn->RecNo;
  try
  {  
    for(SET::iterator it=bookmarks.begin();it!=bookmarks.end();it++)
    {
      gtkn->RecNo = *it;
      int oldCardId = gtkn->FieldByName("CardID")->AsInteger;
      str = Format("INSERT INTO %s (KodSyst, GostID, NameRD) \n\
        Select KodSyst, GostID, NameRD \n\
        From %s Where CardID=%d",
        ARRAYOFCONST((CardTable, SectorTable, oldCardId)));

      qry->SQL->Text = str;
      qry->ExecSQL();  // Добавляем одну родительскую запись

      qry->SQL->Text = "SELECT SCOPE_IDENTITY()";
      qry->Open();
      int newCardId = qry->Fields->Fields[0]->AsInteger;

      str = Format("INSERT INTO %s (CardID, Sp20i19) \n\
        SELECT %d, Sp20i19 \n\
        FROM %s \n\
        WHERE CardID = %d",
        ARRAYOFCONST((CardBreak, newCardId, SectorBreak, oldCardId)));
      qry->SQL->Text = str;
      qry->ExecSQL(); // добавление дочерных записей
    }
  }
  __finally
  {
    gtkn->RecNo = crno;
    gtkn->EnableControls();
  }
1.2K
27 октября 2005 года
richel
142 / / 20.01.2005
Я эту проблему решила по другому. Через запрос. Только пришлось добавить временное поле.
Но этот код очень интересен. Спасибо. Мне в нем все ясно.:)
1.2K
28 октября 2005 года
richel
142 / / 20.01.2005
У меня все-таки возник вопрос к Mоngооsе. Дохожу до места
Цитата:
[COLOR=blue]qry->Open();[/COLOR]

и здесь выдается сообщение:

Цитата:
ADOQuery1: Field 'CardID' not found


Почему оно не найдено? В самом компоненте я вытащила все названия полей. Сам по себе запрос SQL работает. Может как-то по особенному нужно настроить ADOQuery1?
Я бы хотела этот пример довести до конца. Он мне кажется более интересным, чем мой код. Здесь нет никаких временных полей.

488
28 октября 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by richel
Почему оно не найдено? В самом компоненте я вытащила все названия полей. Сам по себе запрос SQL работает. Может как-то по особенному нужно настроить ADOQuery1?

Думаю что не нужно было вытягивать названия полей. Там же 3 разных запроса с разными полями. И наличие полей проверяется только при втором запросе при qry->Open();

1.2K
28 октября 2005 года
richel
142 / / 20.01.2005
Цитата:
Originally posted by Mоngооsе
Думаю что не нужно было вытягивать названия полей. Там же 3 разных запроса с разными полями. И наличие полей проверяется только при втором запросе при qry->Open();


Простите, я оказалась невнимательна. В предыдущей моей задаче приходилось пользоваться такой записью:

Цитата:
String s = ADOQueryGostID->AsString


Там обязательно должны выть вытащены поля в компоненте.
Конечно, все работает. Спасибо огромное. Мне это решение больше нравится.:}

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог