Russian Qt Forum

Qt => Базы данных => Тема начата: burunduk от Март 15, 2007, 00:26



Название: вставка строк в базу данных с кавычками (как проескейпить ?)
Отправлено: burunduk от Март 15, 2007, 00:26
не могу что-то найти решения

QSqlDatabase::database().exec(query);

где query строка и формируется динамически

использовать prepare() + addBindValue() ?
что-то попробывал так, код возврата - истина, а база не меняется
я делаю инсерт запрос


Название: вставка строк в базу данных с кавычками (как проескейпить ?)
Отправлено: crocus от Март 15, 2007, 01:41
Такая же ерунда была,  попробуй использовать не query.exec, а через модель типа так:
Код:

begin = ( "INSERT INTO  " + agency + "(agency_name, flats_date, room_cod, sale_name"
 ", region_name, street_name, So, Sz, Sk, flats_floor, flats_floorest"
 ", material_short, plan_short, wc_short, balcon_short, flats_price, flats_cod, flats_tel "
 ", type_s, side_name, cond_short, agent_name, flats_confid, flats_pm2, flats_comments, sale, flats_ex) SELECT g.agency_name, f.flats_date, r.room_cod, k.sale_name"
 ", a.region_name, s.street_name, f.So, f.Sz, f.Sk, f.flats_floor, f.flats_floorest"
 ", m.material_short, p.plan_short, w.wc_short, b.balcon_short, (f.flats_price + " + txtMarket +
 ")*" + txtCurss + ", f.flats_cod, f.flats_tel "
 ", t.type_s, d.side_name, l.cond_short, n.agent_name, f.flats_confid, (f.flats_price/f.So)*" + txtCurss + ", f.flats_comments, f.sale, f.flats_ex "
 "FROM tbl_flats f, tbl_type t, tbl_sale k, tbl_room r," + tblroom + tblregion + tblstreet + tblplan +
 "tbl_region a, tbl_street s, tbl_wc w, tbl_balcon b, tbl_side d, tbl_cond l," + tblwc + tblbalcon +
 tblmaterial + tblagenci + "tbl_material m, tbl_agency g, tbl_agent n, tbl_plan p "
 "WHERE f.type_cod = t.type_cod  AND f.room_cod = r.room_cod " + room + balcon + material + agenci +
 " AND f.sale_cod = k.sale_cod AND f.street_cod = s.street_cod" + region + street + plan + wc +
 " AND s.region_cod = a.region_cod  AND f.agent_cod = n.agent_cod AND n.agency_cod = g.agency_cod"
 " AND f.wc_cod = w.wc_cod AND f.plan_cod = p.plan_cod AND f.balcon_cod = b.balcon_cod"
 " AND f.material_cod = m.material_cod AND f.side_cod = d.side_cod AND f.cond_cod = l.cond_cod"
modelQuery->setQuery( begin );


Название: вставка строк в базу данных с кавычками (как проескейпить ?)
Отправлено: burunduk от Март 15, 2007, 10:34
Нифига так не ескейпит:

"ERROR:  syntax error at or near "sos" at character 115
QPSQL: Unable to create query"


'sos' пишу в текстовом поле в одинарных кавычках

собираю на Qt 4.1.4


Название: вставка строк в базу данных с кавычками (как проескейпить ?)
Отправлено: Вудруф от Март 15, 2007, 14:17
/'
Или связанные переменные


Название: вставка строк в базу данных с кавычками (как проескейпить ?)
Отправлено: alexis от Март 15, 2007, 21:20
Ну а что мешает в генерируемый запрос вместо реальных данных напихать плейсхолдеров?
И попутно, вести массив данных к  ним.

что-то в этом роде, только у меня тут полностью запрос динамически собирается.

Код:

wheres.append( QString( "( %1 = ? )" ).arg( name ) );
binds.append( *it );

---
sql = QString( "SELECT %1 FROM %2" ).arg( fileds.join(", ") ).arg( table );
sql.append(" WHERE ");
sql.append( Object::access() );

if ( wheres.count() ) {
    sql.append(" AND ( ");
    sql.append( wheres.join( " " ) );
    sql.append( " ) " );
}

sql.append( groups );
sql.append( orders );
sql.append( limit );
sql.append( offset );

if ( opt.contains("explain") )
    explainQuery( sql );

QSqlQuery query( db );
query.prepare( sql );

for( QList<QVariant>::Iterator it = binds.begin(); it != binds.end(); ++it )
                        query.addBindValue( (*it) );
 
[/code]


Название: вставка строк в базу данных с кавычками (как проескейпить ?)
Отправлено: burunduk от Март 16, 2007, 12:45
спасибо за поддержку )

prepare() + addBindValue() + exec()
и всё зашибись, просто тупил уже к концу рабочего дня :-)