Как объединить строки в _bstr_t и wchar_t? - PullRequest
1 голос
/ 27 мая 2019

У меня есть _bstr_t строка, и у меня есть wchar_t и одна unsigned int переменная, которую я хочу поместить в строку ...

_bstr_t strCnn("Driver={SQL Server};Server=some_host,some_port;Database=some_db;User ID=some_user;Password=some_psw;");

wchar_t *host,
unsigned int port,
wchar_t *db_name,
wchar_t *user,
wchar_t *password,

Эти 5 переменных я передаю функции, которая делает соединение. Подскажите, пожалуйста, как мне вставить их в строку подключения.

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

    wstring ws(host);
    string host_str(ws.begin(), ws.end());
    wstring ws_db(db_name);
    string db_str(ws_db.begin(), ws_db.end());
    wstring ws_user(user);
    string user_str(ws_user.begin(), ws_user.end());
    wstring ws_psw(password);
    string psw_str(ws_psw.begin(), ws_psw.end());

    std::string port_str = std::to_string(port);
    _bstr_t strCnn("Driver={SQL Server};Server="+host_str+","+port_str+";Database="+db_str+";User ID="+user_str+";Password="+psw_str+";");

Но там написано:

Error E0289 no instance of constructor "_bstr_t::_bstr_t" matches the argument list 
Error C2664 '_bstr_t::_bstr_t(const _bstr_t &) throw()': cannot convert argument 1 from 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>' to 'const char *' 

Ответы [ 2 ]

1 голос
/ 27 мая 2019

Возможно, самый простой способ - использовать std::wstringstream.

Ваш код может выглядеть примерно так:

    std::wstringstream ws;
    ws << "Driver={SQL Server};Server=" << host << "," << port << ";Database=" << db << ";User ID=" << user << ";Password=" << pswr <<";";
    _bstr_t strCnn(ws.str().c_str());

Конструктор _bstr_t занимает const wchar_t*, поэтому нет необходимости выполнять какие-либо промежуточные преобразования.

0 голосов
/ 28 мая 2019

Когда вы создаете строку для передачи strCnn, это объект std::string._bstr_t не имеет конструктора, который принимает string, но имеет конструктор, который принимает const char * (именно об этом говорит сообщение об ошибке.

Простое исправление заключается в создании вашей строки исохраните это в локальной переменной, затем передайте эту строку (преобразованную в const char *) в конструктор _bstr_t.

std::string port_str = std::to_string(port);
std::string connection = "Driver={SQL Server};Server="+host_str+","+port_str+";Database="+db_str+";User ID="+user_str+";Password="+psw_str+";";
_bstr_t strCnn(connection.c_str());

Это может быть неоптимальный способ построения строки (std::stringstreamможет быть и лучше).

Поскольку ваши исходные строки параметров являются широкими символами, вы можете создать строку подключения с широкими символами (и std::wstring).

...