Russian Qt Forum
Май 21, 2024, 23:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: MSSQL(ODBC) поле как переменная в запросе  (Прочитано 8115 раз)
ParanoidAndroid23
Гость
« : Февраль 02, 2010, 00:41 »

Уважаемые господа !   Улыбающийся
Подскажите пожалуйста, есль ли возможнось подставить в запросе поле как переменную ?

Код:
QString F,string1,ID;
int Number;

query.prepare("UPDATE ActiveTable SET ? = ? WHERE ID = ? AND Number = ?");
        query.bindValue(0,F); // это у нас имя поля которое надо обновить
        query.bindValue(1,string1); // вставлятель :)
        query.bindValue(2,ID); //uniqueid
        query.bindValue(3,Number); //int


На что мне сервер отвечает : [Microsoft][ODBC SQL Server Driver][SQL Server]String or binary data would be truncated. [Microsoft][ODBC SQL Server Driver][SQL Server]The statement has been terminated.   
При указании в запросе поля все работает.

Сразу оговорюсь, что я начинающий и я только начал осваивать данные прелести.
Записан
voronElf
Гость
« Ответ #1 : Февраль 02, 2010, 06:53 »

Скорее всего имя поля через bind подставляется как строковое значение и отсюда ошибка. Попробуй имя поля не через bind вставлять, а просто строковыми операциями

Код:
QString F,string1,ID;
int Number;

query.prepare(QString("UPDATE ActiveTable SET %1 = ? WHERE ID = ? AND Number = ?").arg(F));
        query.bindValue(0,string1); // вставлятель :)
        query.bindValue(1,ID); //uniqueid
        query.bindValue(2,Number); //int
Записан
ParanoidAndroid23
Гость
« Ответ #2 : Февраль 02, 2010, 16:41 »

Скорее всего имя поля через bind подставляется как строковое значение и отсюда ошибка. Попробуй имя поля не через bind вставлять, а просто строковыми операциями

Код:
QString F,string1,ID;
int Number;

query.prepare(QString("UPDATE ActiveTable SET %1 = ? WHERE ID = ? AND Number = ?").arg(F));
        query.bindValue(0,string1); // вставлятель :)
        query.bindValue(1,ID); //uniqueid
        query.bindValue(2,Number); //int

Огромное спасибо  Смеющийся . Я тоже нашел обход этой ситуации , но ваша конструкция мне нравится в 100 раз больше  Подмигивающий
Записан
voronElf
Гость
« Ответ #3 : Февраль 03, 2010, 07:37 »

Рад что помог, а идеей своего обхода поделитесь ?
Записан
ParanoidAndroid23
Гость
« Ответ #4 : Февраль 04, 2010, 10:08 »

Код:
query.exec("UPDATE gcActiveTable SET "+F+" = '"+string1+"' WHERE ID = '"+ID+"' AND Number = '"+Number+"'");
 
Как начинающий , ничего более умного придумать не смог. Но в этом сложнее найти ошибку если она будет. Хотя дэбагер спасает  Смеющийся
« Последнее редактирование: Февраль 04, 2010, 10:10 от ParanoidAndroid23 » Записан
voronElf
Гость
« Ответ #5 : Февраль 05, 2010, 07:12 »

Да в общем-то тот же подход, вполне нормально, формируем строку запроса ручками. Просто через .arg(...) вставлять в строку значения переменных чуть поудобнее и понагляднее  Подмигивающий
Записан
Amigo_sa
Гость
« Ответ #6 : Февраль 05, 2010, 09:32 »

Код:
query.exec("UPDATE gcActiveTable SET "+F+" = '"+string1+"' WHERE ID = '"+ID+"' AND Number = '"+Number+"'");
 

Доброе утро! Хотел бы обратить ваше внимание, что таким образом формировать запрос крайне опасно. тут рассказано почему. Необходимо все-таки использовать парамтризованные запросы.
Записан
voronElf
Гость
« Ответ #7 : Февраль 05, 2010, 10:04 »

Хорошее замечание, не могу не согласиться, конечно же bind делает эскапирование в строковых значениях, а при этом подходе делать ручками приходится и можно забыть.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.071 секунд. Запросов: 21.