CRecordset::AddNew()
От: server_mouse Беларусь  
Дата: 16.11.02 12:44
Оценка:
Hi ALL!

Есть БД на MySQL. В таблице ~30 полей. Все они не являются обязательными, однако если я пытаюсь сделать вот так:
pTbl->AddNew();
pTbl->m_name=_T("[RBS]~R@z(+)R.BY~");
pTbl->Update();

получаю EXCEPTION. Если заполнить все поля -- всё нормально. Как бороться? Не составлять же каждый раз SQL-запрос....
Если человек программист, то это надолго.
Re: CRecordset::AddNew()
От: Grumbler  
Дата: 16.11.02 16:33
Оценка:
Здравствуйте, server_mouse, Вы писали:

SM>Hi ALL!


SM>Есть БД на MySQL. В таблице ~30 полей. Все они не являются обязательными, однако если я пытаюсь сделать вот так:

SM>
pTbl->>AddNew();
pTbl->>m_name=_T("[RBS]~R@z(+)R.BY~");
pTbl->>Update();
SM>

SM>получаю EXCEPTION. Если заполнить все поля -- всё нормально. Как бороться?

Чет я не понял 30 полей а с данными только одно, зачем так много?
А решение простое: заполнять надо все поля !
Добавь еще ~29 строк перед Update.

Я не знаю кто такой MySQL, но если он позволяет можно установить для поля свойство Avialable NULL или что-то в этом духе, тогда его можно будет не заполнять.

SM>Не составлять же каждый раз SQL-запрос....


А этого я вообще не понял ...
Re: CRecordset::AddNew()
От: DuШes  
Дата: 18.11.02 05:30
Оценка:
Здравствуйте, server_mouse, Вы писали:

SM>Hi ALL!


SM>Есть БД на MySQL. В таблице ~30 полей. Все они не являются обязательными, однако если я пытаюсь сделать вот так:

SM>
pTbl->>AddNew();
pTbl->>m_name=_T("[RBS]~R@z(+)R.BY~");
pTbl->>Update();
SM>

SM>получаю EXCEPTION. Если заполнить все поля -- всё нормально. Как бороться? Не составлять же каждый раз SQL-запрос....

Аналогичная ситуация возникает также с конструкцией INSERT, в выражении необходимо перечислить все поля того рекордсета, в который происходит добавление записи, если в них только нет значений по умолчанию. (Сам не один раз наступил на такие-же грабли )
Re[2]: CRecordset::AddNew()
От: server_mouse Беларусь  
Дата: 19.11.02 07:31
Оценка:
Здравствуйте, Grumbler, Вы писали:

G>Чет я не понял 30 полей а с данными только одно, зачем так много?

Всё просто. Эда база данных о пользователях. Поля типа адрес проживания, телефоны, факсы и т.д. -- не обязательны.

G>А решение простое: заполнять надо все поля !

G>Добавь еще ~29 строк перед Update.
Как ты заметил, я пользую MFC. После pTbl->>AddNew(); все поля (у меня CString) равны _T(""). А мне ведь и надо, что бы они были пустыми, т.е. NULL!

G>Я не знаю кто такой MySQL, но если он позволяет можно установить для поля свойство Avialable NULL или что-то в этом духе, тогда его можно будет не заполнять.

Это типа 'заполнено нулём'? Я пользую EMS MySQL Manager -- это поле там доступно только для полей числового типа.

SM>>Не составлять же каждый раз SQL-запрос....

G>А этого я вообще не понял ...
D>Аналогичная ситуация возникает также с конструкцией INSERT, в выражении необходимо перечислить все поля того рекордсета, в который происходит добавление записи, если в них только нет значений по умолчанию. (Сам не один раз наступил на такие-же грабли )

CDatabase *pBase;
//.... инициализация
pTbl=new CClientSet(pBase); //class CClientSet : public CRecordset
pTbl->Open(CRecordset::snapshot);
pBase->ExecuteSQL("INSERT INTO clients (name) VALUES ('TEST');");
//INSERT INTO РАБОТАЕТ!
//А вот это НЕТ:
pTbl->AddNew();
pTbl->m_name=_T("TEST2");
pTbl->Update();  //EXCEPTION

Хм. А у меня работает, как показано выше...
Как вообще нужно обрабатывать все эти символы, которые навводил глупый пользователь (типа [[}i{!@$%^'''"^&$@#*&(}}]]"") что бы SQL-запросы/команды были ПРАВИЛЬНЫМИ???
Если человек программист, то это надолго.
Re[3]: CRecordset::AddNew()
От: Grumbler  
Дата: 24.11.02 16:21
Оценка:
Здравствуйте, server_mouse, Вы писали:


SM>
SM>CDatabase *pBase;
SM>//.... инициализация
SM>pTbl=new CClientSet(pBase); //class CClientSet : public CRecordset
pTbl->>Open(CRecordset::snapshot);
pBase->>ExecuteSQL("INSERT INTO clients (name) VALUES ('TEST');");
SM>//INSERT INTO РАБОТАЕТ!
SM>//А вот это НЕТ:
pTbl->>AddNew();
pTbl->>m_name=_T("TEST2");
pTbl->>Update();  //EXCEPTION
SM>

SM>Хм. А у меня работает, как показано выше...

Если так работает, то это, пожалуй, единственный рациональный выход из положения.

SM>Как вообще нужно обрабатывать все эти символы, которые навводил глупый пользователь (типа [[}i{!@$%^'''"^&$@#*&(}}]]"") что бы SQL-запросы/команды были ПРАВИЛЬНЫМИ???


А здесь вообще, практически без проблем.
Единственный символ,который может помешать — ' (апостроф) его можно попробовать удвоить (хотя это зависит от SQL).
... Ну еще если LIKE использовать, то с % могут быть проблемы.
А все остальные по барабану (раз уж юзеру так нравится себя называть)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.