Версия для печати темы
Форум на CrossPlatform.RU _ Qt Разработка баз данных _ Выборка из базы данных
Автор: AD 17.6.2010, 17:23
Подскажите, пожалуйста, как я могу получить значени поля secrKey в следующем запросе:
Select cast(secretKey as binary(8)) as secrKey from DeviceList where serialNumber = '22021 '
Код следующий:
QString select_query("Select cast(secretKey as binary(8)) as secrKey from DeviceList where serialNumber = '%1'");
//////////////////////////////////
select_query = select_query.arg(serialNumber);
bool rt = query.exec(select_query);
int i = 0;
while(query.next())
{
QString fs = query.value(i).toString();
++i;
}
Я получаю в функции fs только строку secretKey, а вот как мне узнать secrKey? Заранее благодарю за оперативный ответ. В ассистенте не нашел как это сделать.
Автор: BRE 17.6.2010, 17:48
Я не большой специалист в SQL, но попробуй следующий код:
QSqlQuery query;
query.prepare("select secretKey from DeviceList where serialNumber = :serNum");
query.bindValue( ":serNum", serialNumber );
if( query.exec() && query.next() )
QString fs = query.value( 0 ).toString();
Автор: AD 17.6.2010, 17:56
Цитата(BRE @ 17.6.2010, 18:48)

Я не большой специалист в SQL, но попробуй следующий код:
QSqlQuery query;
query.prepare("select secretKey from DeviceList where serialNumber = :serNum");
query.bindValue( ":serNum", serialNumber );
if( query.exec() && query.next() )
QString fs = query.value( 0 ).toString();
Не. Ты меня не понял. Простой запрос выборки он выполняет на УРА. Мне необходимо взять результат выборки, находящийся в псевдониме secrKey.
Автор: inviZ 17.6.2010, 18:34
Хм, что-то немного непонятно, а что именно ты хочешь получить-то? Какой исходный тип у secrKey ?
Может нужно как-нибудь так, если ты все же хочешь получить 8 байт?
QByteArray bytes = query.value(0).toByteArray();
Автор: AD 17.6.2010, 18:43
Цитата(inviZ @ 17.6.2010, 19:34)

Хм, что-то немного непонятно, а что именно ты хочешь получить-то? Какой исходный тип у secrKey ?
Может нужно как-нибудь так, если ты все же хочешь получить 8 байт?
QByteArray bytes = query.value(0).toByteArray();
Да нет же. Sql-запрос, который приведен, это запрос, преобразующий строку, состоящую из черт-знает каких символов в их шестнадцатеричные коды. Мне надо взять эту строку кодов исходной строки, т.е. secrKey, а не саму строку.
Автор: Litkevich Yuriy 17.6.2010, 18:47
Цитата(inviZ @ 17.6.2010, 22:34)

Какой исходный тип у secrKey ?
там же простое приведение типа к
binary( 8 )AD, по идее ты именно secrKey и получаешь и ничего больше. Поэтому
i больше нуля должно приводить к аварийному завершению программы. Просто ты сразу возвращаемое значение к строке приводишь:
query.value(i).toString();
Автор: BRE 17.6.2010, 18:49
Какая БД используется?
Этот запрос в sqlbrowser дает нужный результат?
Автор: AD 17.6.2010, 18:54
Ладно, чтобы было понятно, вот результат выборки через СУБД и выборка программы.
Запрос
select cast(secretKey as binary(8)) as secretKey from dbo.DeviceList where secretKey <> '' and serialNumber = '22021 '
Результат СУБД SQL Server:
0x3C7C70A73D8098DF
программный код
bool rt = query.exec(select_query);
query.next();
QString str(query.value(0).toString());
Результат кода:
<|p§=Ђ�Я
Так вот мне нужен результат, подобный тому, что я получаю в СУБД.
Автор: Litkevich Yuriy 17.6.2010, 19:04
Цитата(AD @ 17.6.2010, 22:54)

Так вот мне нужен результат, подобный тому, что я получаю в СУБД.
ты послушай проверь, как
BRE советует
Автор: inviZ 17.6.2010, 19:13
bool rt = query.exec(select_query);
query.next();
QByteArray bytes = query.value(0).toByteArray();
QString str = "0x";
foreach(quint8 b, bytes)
{
str.append(QString("%1").arg((uint)b, 2, 16, QChar('0')));
}
Пробуй.
Автор: AD 17.6.2010, 19:21
Цитата(inviZ @ 17.6.2010, 20:13)

Пробуй.
Ты гений. СПАСИБО!
Автор: inviZ 17.6.2010, 19:26
Смысл в том, что SQL Server возвращает на твой запрос просто 8 байт данных. Естественно, если ты попытаешься представить их в виде строки, у тебя получится белиберда.
Цитата
<|p§=Ђ�Я
Например, '<' здесь это 0x3C, '|' - 0x7C, ну и так далее.
И клиент, который выдает тебе "0x3C7C70A73D8098DF", тоже аналогичным образом форматирует эти байты в удобном для тебя виде.
Автор: AD 17.6.2010, 19:35
Цитата(inviZ @ 17.6.2010, 20:26)

Смысл в том, что SQL Server
Цитата
<|p§=Ђ�Я
Например, '<' здесь это 0x3C, '|' - 0x7C, ну и так далее.
И клиент, который выдает тебе "0x3C7C70A73D8098DF", тоже аналогичным образом форматирует эти байты в удобном для тебя виде.
Фишка не в этом!

Он и должен выдавать билибердовую строку, это ведь секретный ключ!

Дело в том, что в зависимости от кодировки, шестнадцатеричный код некоторых символов отличается, что есть очень плохо. А вот сейчас эти отличия нивелируются.
Автор: BRE 17.6.2010, 19:41
Так может проще использовать:
QByteArray QByteArray::toHex () const
Автор: AD 17.6.2010, 19:59
Цитата(BRE @ 17.6.2010, 20:41)

Так может проще использовать:
QByteArray QByteArray::toHex () const
Да!

Я уже так и сделал!
Автор: inviZ 18.6.2010, 11:28
Цитата(BRE @ 18.6.2010, 3:41)

Так может проще использовать:
QByteArray QByteArray::toHex () const
Ха, точно, тупица я, не знал про этот метод)
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)