Пишу программу, которая должна уметь работать как с MySQL, так и с PostgreSQL и Oracle. Самый легкий путь - ODBC.
Столкнулся с некоторыми проблемами. Делаю запрос select:
Код:
SQLBindCol(conf->hstmtSQL,1,SQL_C_USHORT, &id, sizeof(id), &errSQL);
SQLBindCol(conf->hstmtSQL,2,SQL_C_CHAR, &hostname, sizeof(hostname), &errSQL);
SQLBindCol(conf->hstmtSQL,3,SQL_C_CHAR, &ip, sizeof(ip), &errSQL);
SQLBindCol(conf->hstmtSQL,4,SQL_C_CHAR, &community, sizeof(community), &errSQL);
SQLBindCol(conf->hstmtSQL,5,SQL_C_CHAR, &nas_id, sizeof(nas_id), &errSQL);
SQLBindCol(conf->hstmtSQL,6,SQL_C_CHAR, &if_nas_name, sizeof(if_nas_name), &errSQL);
SQLBindCol(conf->hstmtSQL,7,SQL_C_UTINYINT, &type, sizeof(type), &errSQL);
result=SQLExecDirect(conf->hstmtSQL,
"SELECT id, hostname, ip, rcommunity, nas_id, if_nas_name, type FROM devices WHERE status=1",SQL_NTS);
i=0;
result=SQLFetch(conf->hstmtSQL);
while(result != SQL_NO_DATA)
{
conf->routers[i].name=strdup(hostname);
conf->routers[i].alias=strdup(nas_id);
conf->routers[i].id=id;
conf->routers[i].if_nas_name=strdup(if_nas_name);
conf->routers[i].ip=inet_addr(ip);
conf->routers[i].community=strdup(community);
conf->routers[i].type=type;
result=SQLFetch(conf->hstmtSQL);
i++;
}
Проблема в том, что, например, поле nad_id может имет значение NULL, в этом случае при выполнении очередного SQLFetch значение буфера nas_id никак не изменится. Как определить, что присутствует NULL?
И еще проблема. При дисконекте второй раз невозможно соединиться базой из того же процесса, появляется ошибка:
Character set 'koi8r' is not a compiled character set and is not specified in the '/usr/local/share/mysql/charsets/Index.xml' file
[unixODBC][MySQL][ODBC 3.51 Driver]Can't initialize character set koi8r (path: /usr/local/share/mysql/charsets/) (2019)
Причем все приложения, не использующие ODBC, работают с MySQL нормально.
В чем может быть дело?