Hi ALL!
Есть БД на MySQL. В таблице ~30 полей. Все они не являются обязательными, однако если я пытаюсь сделать вот так:
pTbl->AddNew();
pTbl->m_name=_T("[RBS]~R@z(+)R.BY~");
pTbl->Update();
получаю EXCEPTION. Если заполнить все поля -- всё нормально. Как бороться? Не составлять же каждый раз SQL-запрос....
Здравствуйте, 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-запрос....
А этого я вообще не понял
...
Здравствуйте, 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, в выражении необходимо перечислить все поля того рекордсета, в который происходит добавление записи, если в них только нет значений по умолчанию. (Сам не один раз наступил на такие-же грабли
)
Здравствуйте, 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-запросы/команды были ПРАВИЛЬНЫМИ???
Здравствуйте, 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 использовать, то с
% могут быть проблемы.
А все остальные по барабану (раз уж юзеру так нравится себя называть)