Grazie per l’indicazione, ma purtroppo la “L” davanti alla stringa temo che non basti (il doppio punto e virgola è stato uno dei tanti tentativi cambiando la stringa di connessione, ma non è quello il problema).
Sto ricostruendo la logica, ma devo ammettere che è stranamente complicato. Dico stranamente perché sembra che mi stia avventurando in territori inesplorati ma non dovrebbe essere così: Sql Server di Microsoft è senz’altro uno dei database più diffusi al mondo, così come c++ è uno dei linguaggi più usati. Ovviamente i due si parlano alla fine, ho copia/incollato questo programma di esempio:
https://learn.microsoft.com/en-us/sql/connect/odbc/cpp-code-example-app-connect-access-sql-db?source=recommendations&view=sql-server-ver16
e funziona benissimo, peccato che anche qui per compilarlo ho dovuto fare una correzione:
if (argc > 1)
{
pwszConnStr = *++argv;
}
else
{
//pwszConnStr = L"";
//dà errore: error C2440: '=': impossibile convertire da 'const wchar_t [1]' a 'WCHAR *'
pwszConnStr = *++argv; //era tanto per mettere qualcosa e andare avanti, ovviamente non ha senso
}
Il programma in questione di Microsoft fa selezionare i DSN da una finestra di popup e poi apre una riga comando ()tipo cmd del dos) dove si possono dare dei comandi Transact SQL.
Detto questo solo a titolo di esempio, non è dove volevo arrivare io, per cui tornando un passo indietro ho scoperto che non è così semplice passare da una normalissima stringa di c++ al tipo SQLWCHAR che è un tipo complesso e che mi pare di aver capito che è un array di wchar_t. Questo è il codice più vicino alla soluzione teorica che ho trovato:
SQLWCHAR stringadiconnessione;
string wsdc = "DRIVER={SQL Server};UID=sa;PWD=Miapwd;DATABASE=Miodb;WSID=NB-miopc;APP=Sistema operativo Microsoft® Windows®;SERVER=Mioserver;Description=Test;";
int wchars_num = MultiByteToWideChar(CP_UTF8, 0, wsdc.c_str(), -1, NULL, 0);
wchar_t* wstr = new wchar_t[wchars_num]; // Qui mi dà errore
MultiByteToWideChar(CP_UTF8, 0, wsdc.c_str(), -1, wstr, wchars_num);
//stringadiconnessione = (SQLWCHAR)wstr; Questa non gli piace propro
In pratica da quel poco che capisco, da ignorante di c++ quale sono, si tratta di trasformare la stringa di connessione in un array di wchar_t (probabilmente a causa dell'UTF8 i caratteri normali non bastano) passando dalla funzione “MultiByteToWideChar”, la quale però necessita di due chiamate: la prima per recuperare la lunghezza, e la seconda per fare la trasformazione vera e propria. Il “new” dovrebbe trasformarmi la funzione (array?) in un puntatore di memoria, ma il compilatore si indigna e dice testualmente “C2362: inizializzazione di 'wstr' ignorata da istruzione 'goto END'” che è uno dei messaggi più misteriosi che io abbia mai visto. Anche riuscendo a superare questo scoglio però dovrei fare in qualche modo il cast ad una variabile (stringadiconnessione) compatibile col tipo della funzione (SQLWCHAR). E qui si arrabbia parecchio, forse preventivamente, non so se a causa dell’errore prima o se sto sparando a caso col cast perché non c’ho capito niente.
Mi permetto di insistere perché anche non dovendo riuscire ad arrivare in fondo, magari lascio una traccia, un aiuto, per futuri eroici esploratori che faranno ricerche in rete e su questo argomento in italiano si trova poco.