Russian Qt Forum

Qt => Базы данных => Тема начата: ParanoidAndroid23 от Февраль 02, 2010, 00:41



Название: MSSQL(ODBC) поле как переменная в запросе
Отправлено: 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.   
При указании в запросе поля все работает.

Сразу оговорюсь, что я начинающий и я только начал осваивать данные прелести.


Название: Re: MSSQL(ODBC) поле как переменная в запросе
Отправлено: voronElf от Февраль 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


Название: Re: MSSQL(ODBC) поле как переменная в запросе
Отправлено: ParanoidAndroid23 от Февраль 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

Огромное спасибо  ;D . Я тоже нашел обход этой ситуации , но ваша конструкция мне нравится в 100 раз больше  ;)


Название: Re: MSSQL(ODBC) поле как переменная в запросе
Отправлено: voronElf от Февраль 03, 2010, 07:37
Рад что помог, а идеей своего обхода поделитесь ?


Название: Re: MSSQL(ODBC) поле как переменная в запросе
Отправлено: ParanoidAndroid23 от Февраль 04, 2010, 10:08
Код:
query.exec("UPDATE gcActiveTable SET "+F+" = '"+string1+"' WHERE ID = '"+ID+"' AND Number = '"+Number+"'");
 
Как начинающий , ничего более умного придумать не смог. Но в этом сложнее найти ошибку если она будет. Хотя дэбагер спасает  ;D


Название: Re: MSSQL(ODBC) поле как переменная в запросе
Отправлено: voronElf от Февраль 05, 2010, 07:12
Да в общем-то тот же подход, вполне нормально, формируем строку запроса ручками. Просто через .arg(...) вставлять в строку значения переменных чуть поудобнее и понагляднее  ;)


Название: Re: MSSQL(ODBC) поле как переменная в запросе
Отправлено: Amigo_sa от Февраль 05, 2010, 09:32
Код:
query.exec("UPDATE gcActiveTable SET "+F+" = '"+string1+"' WHERE ID = '"+ID+"' AND Number = '"+Number+"'");
 

Доброе утро! Хотел бы обратить ваше внимание, что таким образом формировать запрос крайне опасно. тут (http://ru.wikipedia.org/wiki/%D0%92%D0%BD%D0%B5%D0%B4%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_SQL-%D0%BA%D0%BE%D0%B4%D0%B0) рассказано почему. Необходимо все-таки использовать парамтризованные запросы.


Название: Re: MSSQL(ODBC) поле как переменная в запросе
Отправлено: voronElf от Февраль 05, 2010, 10:04
Хорошее замечание, не могу не согласиться, конечно же bind делает эскапирование в строковых значениях, а при этом подходе делать ручками приходится и можно забыть.