2010-12-15 5 views
0

Я использую SOCI для подключения MYSQL к моему приложению QT4 C++. Я мог бы жестко закодировать IP-адрес mysql, имя пользователя и пароль, но я предпочел бы передать эту информацию вместо переменной.Как использовать переменную в строке аргумента?

Например, я хотел бы сделать что-то вроде этого, но нет функции, которые принимают эти виды параметров:

char host [9]; 
sprintf(host, "192.x.x.x"); 
session sql(mysql, "host=%s db=dbname user=user password=password", host); 

Я также пробовал:

string host = "192.x.x.x"; 

session sql(mysql, 
      boost::format("host=%1% db=dbname user=user password='pword'", 
          %host)); 

Но это также терпит неудачу ,

UPDATE: Я был в состоянии решить эту проблему следующим образом:

QString connection; 
connection.append("host=" + host + 
        " db=dbname user=" + uname + 
        " password=" + pword); 

session sql(mysql, connection.toLatin1().data()); 

ответ

1

Попробуйте использовать функцию arg аргумента QString.

session sql(mysql, QString("host=%1 db=%2 user=%3 password=%4").arg(sqlserver).arg(dbname).arg(user).arg(password)); 

Я знаю, что это уродливо, и Qt должен придумать более красивое решение, но оно работает.

+0

ошибка: нет соответствующей функции для вызова в soci :: session :: session (const soci :: mysql_backend_factory &, QString) '??? Думаю, ему нужен const char ??? – JonnyCplusplus 2010-12-15 20:49:28

1

Использование string streams.

Затем вы можете построить строку и объединить переменные во время своей работы. Звоните .str().c_str() в конце.

+0

Вы также должны использовать `.c_str()` в конце, чтобы получить свой `const char *`. – 2010-12-15 22:26:46

+1

.str(). C_str(), сначала для строки, а затем для const char * – dutt 2013-02-15 19:44:51

1

Вы не можете просто произвольно передать любую функцию, которая ожидает строку, содержащую форматирование, а затем переменную величину того, что после нее. C++ просто так не работает. Вам нужно построить свою строку, прежде чем передавать ее. Как? Остальные два ответа предоставляют способы, даже если они ошибочно принимают вызывающую семантику конструктора session (это ваша роль, чтобы выяснить). Вы также можете рассмотреть возможность использования boost :: format или, если хотите быть злым, sprintf.

Смежные вопросы