powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / CRecordset - изменение значений полей
8 сообщений из 8, страница 1 из 1
CRecordset - изменение значений полей
    #32348937
harinag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возможно ли изменение данных конкретного поля в таблице без применения механизма RFX? (используются классы CDatabase и CRecordset в VC++)
То есть без необходимости создавать класс-потомок от CRecordset.
P.S. Использование запроса UPDATE - не подходит. Нужно что-то вроде функции SetFieldValue класса CDaoRecordset.
...
Рейтинг: 0 / 0
CRecordset - изменение значений полей
    #32349042
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неа... Цитата из хэлпа на CRecordset:: Get FieldValue():

Note Unlike the DAO class CDaoRecordset, CRecordset does not have a SetFieldValue member function. If you create an object directly from CRecordset, it is effectively read-only.

В CRecordset::Update() используется SQLSetPos(), когда не SQL-выражение UPDATE.

А чем тебя не устраивает UPDATE, если не секрет?
...
Рейтинг: 0 / 0
CRecordset - изменение значений полей
    #32350714
harinag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UPDATE не подходит, так как мне нужно изменять данные в конкретной записи, в таблице нету поля с уникальным номером записи. Короче - ключа нет...
Тогда как задать нужную запись в условии WHERE при запросе на обновление?
...
Рейтинг: 0 / 0
CRecordset - изменение значений полей
    #32351010
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жаль, что нет никакого ключа. Как же ты попадаешь на нужную запись?

База у тебя какая? Access?

Если посмотреть, что делает CRecordset::Update(), то видно, что он обновляет текущую запись одним из двух способов: или функцией SQLSetPos(), или SQL-выражением типа "UPDATE ... WHERE CURRENT OF <имя курсора>". Я ни того ни другого не делал, и не уверен что второй пройдёт на Access(97).

И ещё вопрос: чем тебя не устраивает породить класс от CRecordset и использовать RFX? Я подозреваю, что его можно приспособить к твоим целям.
...
Рейтинг: 0 / 0
CRecordset - изменение значений полей
    #32351021
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поторопился. На Access2000 как раз используется WHERE CURRENT OF, примерно так:
UPDATE t SET [F1]=?,[F2]=? WHERE CURRENT OF SQL_CUR00dfb410;
Имя курсора достаётся функцией SQLGetCursorName().
...
Рейтинг: 0 / 0
CRecordset - изменение значений полей
    #32351230
harinag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
База действительно Аксессовская.
А вот про такое условие "WHERE CURRENT OF" я не знал, признаюсь!...
Спасибо большое за подсказку. Я думал, что если я через запрос буду делать, то как задам нужное поле, если нет уникального. Оказывается можно обновить текущее.
Как находится нужная запись? Путем перемещения по таблице (хотя пока еще не реализовал :)
А почему не подходит RFX? - просто я не могу знать точно, какие поля попадут ко мне из выборки (универсальная задача такая получается) и поэтому нет возможности связать конкретное поле с конкретной переменной.
Еще раз спасибо за совет, ОйВэй!
...
Рейтинг: 0 / 0
CRecordset - изменение значений полей
    #32351457
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рад был помочь, harinag!

Тем не менее напишу ещё совет.
Список имён полей у тебя всё-таки на момент выполнения должен быть, правда?
Тогда довольно просто занести эти имена в массив, а в параллельный массив (а ещё лучше в CMap с ключом-именем поля) -- переменные, которые будут принимать/передавать значения этих полей. А в DoFieldExchange вставить цикл по этим массивам.
У нас в фирме эта "универсальная задача" решена именно так.
...
Рейтинг: 0 / 0
CRecordset - изменение значений полей
    #32663362
titan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос в тему.
Только вот я использую не Access , а Oracle.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
 
  Объявил класс:
 class WorkLongData : public CRecordset  
{
  public:
	WorkLongData(CDatabase* pDatabase);
	virtual ~WorkLongData();
             virtual void DoFieldExchange(CFieldExchange* pFX); // RFX support 

             int  id_col;
};

 DoFieldExchange выглядит след образом 

void WorkLongData::DoFieldExchange(CFieldExchange* pFX)
{
    pFX->SetFieldType(CFieldExchange::outputColumn);
	RFX_Int(pFX, _T("[id]"), id_col);
}

  Соединение с базой установлено.
  Делаю следующее:

 WorkLongData  testdata ( тут указываю CDatabase);
 testdata.Open(CRecordset::snapshot,"Select * from test;",CRecordset::appendOnly);
  
  testdata.AddNew();
  testdata.id_col= 1 ;
  testdata.SetFieldDirty(&testdata.id_col);

  testdata.Update();  // здесь вылетает 

На команде testdata.Update(); вылетает и пишет ошибку ORA-00911
Которая гласит:
ORA-00911 invalid character
Cause: Special characters are valid only in certain places. If special characters
other than $, _, and # are used in a name and the name is not enclosed in
double quotation marks (”), this message will be issued. One exception to this
rule is for database names; in this case, double quotes are stripped out and
ignored.
Action: Remove the invalid character from the statement or enclose the object
name in double quotation marks.

Где этот символ мне понятно. Может этот запрос мешает , который выбирал данные из таблицы ?
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / CRecordset - изменение значений полей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]