Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QT+freeTDS+unixODBC+MSSQL2005
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Разработка баз данных
rusvid
Я новичок в программировании под Linux и в QT в частности. Не получается заставить работать сабжевую связку.
Делал следующим образом:
1. Собрал unixODBC
Раскрывающийся текст
#cd unixODBC-2.2.14
#./configure --enable-gui=no
#make
#make install

2. Собрал freeTDS
Раскрывающийся текст
#cd freetds-0.82
#./configure --with-tdsver=8.0 --with-unixodbc=/usr/local
#make
#make install

3. Собрал qt-4.6.0
Раскрывающийся текст
./configure -I /usr/local/include/ -L /usr/local/lib/ -plugin-sql-odbc
#make
#make install

4. Сконфигурировал:
/usr/local/etc/freetds.conf
Раскрывающийся текст
[MSTEST]
host = test
port = 1433
tds version = 8.0
client charset = UTF-8

/usr/local/etc/odbcinst.ini
Раскрывающийся текст
[ODBC]
Trace = Yes
TraceFile = /tmp/sql.log
ForceTrace = Yes
Pooling = No

[TDS]
Description = TDS driver (Sybase/MS SQL)
Driver = /usr/local/lib/libtdsodbc.so
Setup = /usr/local/lib/libtdsS.so
Trace = Yes
TraceFile = /tmp/freetds.log
FileUsage = 1

/usr/local/etc/odbc.ini
Раскрывающийся текст
[gambit]
Description = FreeTDS
Driver = TDS
Servername = MSTEST
Database = gb1
Trace = Yes
TraceFile = /tmp/gambit.log
Port = 1433
TDS_Version = 8.0


Пытаюсь выполнить следующую хранимую процедуру:
ALTER procedure [dbo].[fp_test]
(
@Name varchar(50)
)
as
select 777


Код клиента:
QCoreApplication a(argc, argv);
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("gambit");
db.setUserName("login");
db.setPassword("password");
if (!db.open()) return 1;

QString strName = "QSql::In string";

QSqlQuery query;
query.prepare("{CALL fp_test(?)}");
query.bindValue("Name",strName);
if (!query.exec()) return 2;

Получаю:
Цитата
Запускается /home/alexey/work/TestODBC/TestODBC...
QODBCResult::exec: unable to bind variable: " [FreeTDS][SQL Server]Invalid data type"
/home/alexey/work/TestODBC/TestODBC завершился с кодом 2


cat /tmp/sql.log
Раскрывающийся текст
...
[ODBC][2139][1261399807.724945][SQLPrepare.c][192]
Entry:
Statement = 0x8d3a808
SQL = [{CALL fp_test(?)}][length = 17]
[ODBC][2139][1261399807.725091][SQLPrepare.c][367]
Exit:[SQL_SUCCESS]
[ODBC][2139][1261399807.725259][SQLBindParameter.c][213]
Entry:
Statement = 0x8d3a808
Param Number = 1
Param Type = 1
C Type = -8 SQL_C_WCHAR
SQL Type = -9 SQL_WVARCHAR
Col Def = 30
Scale = 0
Rgb Value = 0x8cf374a
Value Max = 30
StrLen Or Ind = 0xbfb1a474
[ODBC][2139][1261399807.725359][SQLBindParameter.c][393]
Exit:[SQL_ERROR]
DIAG [S1004] [FreeTDS][SQL Server]Invalid data type


...

Litkevich Yuriy
rusvid, а другие запросы, например, SELECT выполняются нормально?
MoPDoBoPoT
Ты не правильно используешь функцию QSqlQuery::bindValue(). Ты подготовил запрос для позиционного связывания (query.prepare("{CALL fp_test(?)}"); ), а биндишь не понятно что (query.bindValue("Name",strName); )
Надо либо так:
query.bindValue(0, strName);

либо так
query.addBindValue (strName);
rusvid
Цитата(MoPDoBoPoT @ 21.12.2009, 16:18) *
Ты не правильно используешь функцию QSqlQuery::bindValue().

Не, проблема, имхо, не в этом. Извиняюсь, что сразу не написал, но:
1. Под Виндой данный код работает.
2. Для целочисленного параметра аналогичный код работает под виндой и линуксом:

Т.е. такая процедура:
ALTER procedure [dbo].[fp_test]
(@Number int out
)
as
select @Number = 777

И такой код:
QSqlQuery query;
query.prepare("{CALL fp_test(?)}");
query.bindValue("Number",n,QSql::Out);
if (!query.exec()) return 2;

n = query.boundValue("Number").toInt();

Отрабатывают замечательно.
Т.е. проблема именно в строковых (varchar) параметрах.

Хотя для очистки совести опробовал и твои варианты - результат тот же самый.

Цитата(Litkevich Yuriy @ 21.12.2009, 20:14) *
rusvid, а другие запросы, например, SELECT выполняются нормально?

Как уже написал выше проблемы только со строками. Соотвественно, если выдергиваем не строковые данные, то все ок.

На выборке varchar-данных, например:
QSqlQuery query("SELECT name FROM clients");
query.setForwardOnly(true);
while (query.next())
{  cout << qPrintable(query.value(0).toString()) << endl;
}

Получаю кучу:
Цитата
qGetStringData: Error while fetching data ( "[FreeTDS][SQL Server]Program type out of range" )


Подозреваю, что где-то что-то с кодировками напутано, но что ?
MoPDoBoPoT
Цитата(rusvid @ 21.12.2009, 17:02) *
Подозреваю, что где-то что-то с кодировками напутано, но что ?

Навряд ли. Иначе кракозябры, но получил.
Tonal
Попробуй к опциям сборки добавить --enable-msdblib
rusvid
Цитата(Tonal @ 24.12.2009, 15:17) *
Попробуй к опциям сборки добавить --enable-msdblib

Подскажи, плиз, поподробнее, что именно собирать ? свое приложение ?
Tonal
Собирать FreeTDS.
Я, когда возился, со связкой FreeTDS + PyMSSQL то кодировку пришлось в win1251 выставить - с utf-8 не работало. :(
Но это было ещё на FreeTDS версии 0.6.х.
Как сейчас - не разбирался.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.