LINUX.ORG.RU

Как подключиться к MS SQL Server из Qt-приложения

 , , , ,


0

2

Собственно, интересует сабж. Код, которым я подключаюсь к базе, на винде работает хорошо. На линуксе же сыпет пакостями а-ля не найден драйвер и подобное. Многое пробовал, ODBC ставил, пересобирал, FreeTDS пытался цеплять.Не пробовал только платный драйвер Easysoft. Подскажите пожалуйста рабочую последовательность действий(и пример кода, если он отличается от традиционного) для подключения к MS SQL Server из linux.

Для fedora/centos:

yum install freetds.x86_64 qt-odbc.x86_64
cat << EOF > /etc/odbcinst.ini
[FreeTDS]
Description=v0.63 with protocol v8.0
Driver=/usr/lib64/libtdsodbc.so.0
Setup=/usr/lib64/libtdsS.so.2
UsageCount=1
Threading=1
EOF

cat << EOF > ~/.odbc.ini
[AXFILEINTEG]
Driver=FreeTDS
Description=Your MS SQL Server.
Trace=No
Server=hostname\INSTANCE
Database=mydatabase
TDS_Version=8
TextSize=4294967295
client charset = win1251
EOF

Freetds + unixODBC штука довольно глючная, в частности у меня резала данные некоторых полей в простом select из вьюхи. Приходилось шаманить с версией tds. И делать гадости, типа repalce(field_name, 'null', 'null'). Ничего, кроме select'а через него не пробовал.

Использование:

const QString sql_type = "QODBC3";

bool UserSQLProvider::init_db(const string &hostname, int portnumber, const string &username, const string &password, const string &database)
{
	_failed = true;
	// Создаём объект для подключения к базе данных с именеи connection_name. Если такое имя уже использовалось, то предыдущее подключение закрывается.
	// Т.о. может существовать только один одновременно работающий поставщик UserSQLProvider.
	db = QSqlDatabase::addDatabase(sql_type);
	if(!db.isValid())
	{
		error << "Не удалось создать правильный объект QSqlDatabase.\n\tQSqlDriver:\t" << sql_type.toStdString() << endl;
		return false;
	}
	if(!hostname.empty())
		db.setHostName(QString::fromStdString(hostname));
	if(portnumber)
		db.setPort(portnumber);
	if(!database.empty())
		db.setDatabaseName(QString::fromStdString(database));
	if(!username.empty())
		db.setUserName(QString::fromStdString(username));
	if(!password.empty())
		db.setPassword(QString::fromStdString(password));
	if(!db.open())
	{
		error << "Не удалось подключиться к базе данных: " << database << "\n\tна хосте: " << hostname << "\n\tпод логином: " << username << endl;
		if(!password.empty())
			error << "\tc не пустым паролем.\n\tСтрока ошибки:\n\t\t";
		error << db.lastError().text().toStdString() << endl;
		return false;
	}
	else
		if(debug)
			cmdout << "Установлено соединение с базой данных " << db.databaseName().toStdString() << " на сервере " << db.hostName().toStdString() << ":" << db.port() << "!\n";
	query = new QSqlQuery(db);
	_failed = false;
	// Если не было установлено активной базы данных, то перечислить все базы данных на сервере.
	if(verbose && database.empty())
	{
		query->exec("SELECT name FROM master.dbo.sysdatabases");
		cmdout << "Доступные базы данных на сервере " << db.hostName().toStdString() << ":\n";
		while(query->next())
			cmdout << query->value(0).toString().toStdString() << endl;
		query->clear();
	}
	return true;
}

Если qmake, то в .pro файл добавь DEFINES += QT_DEBUG_PLUGINS. Тогда будет ругаться, если не удастся загрузить плагины.

Ivan_qrt ★★★★★
()
Ответ на: комментарий от DELIRIUM

Когда интересовался, его не нагуглил. Но мало что может быть хуже freetds + unixODBC.

А у libodb-c++ своя реализация драйвера, или он тоже на freetds (unixODBC?) завязан?

Ivan_qrt ★★★★★
()
Ответ на: комментарий от Ivan_qrt

Я много использовал mssql из qt4 через freetds и каких-то особых проблем не было. В линуксе я использовал драйвер QTDS, в винде – QODBC. Точно были запросы select, insert, update, с ними проблем не помню. Ну шаманить точно не приходилось. Насколько я знаю эта штука затем без изменений перешла в qt5-окружение.

Да, самое неприятное – необходимость ini-файла.

staseg ★★★★★
()
Ответ на: комментарий от Ivan_qrt

Насколько я знаю, своя. Но я не пробовал, через ODB работал только с mysql и postgres.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от staseg

qtds не пробовал. Даже не слышал про него ни разу, но если понадобится опять, учту.

Судя по-всему сам freetds нормальный. Тот же питон, емнип, его использует, и при этом работает без бубна. А вот с unixODBC + freetds проблем было много. Как из qt-odbc, так и из встроенного клиента unixodbc.

Ivan_qrt ★★★★★
()
Ответ на: комментарий от staseg

Разобрался с QTDS, спасибо, вроде всё хорошо. Настораживает только то, что в документации он значится неподдерживаемым.

napukmaxep
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.