crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QT+freeTDS+unixODBC+MSSQL2005
Гость_rusvid_*
сообщение 21.12.2009, 15:59
Сообщение #1





Гости








    


Я новичок в программировании под 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
  опции профиля:
сообщение 21.12.2009, 16:14
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


rusvid, а другие запросы, например, SELECT выполняются нормально?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MoPDoBoPoT
  опции профиля:
сообщение 21.12.2009, 16:18
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


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

либо так
query.addBindValue (strName);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rusvid
  опции профиля:
сообщение 21.12.2009, 17:02
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 21.12.2009
Пользователь №: 1323

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(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
  опции профиля:
сообщение 21.12.2009, 23:05
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


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

Навряд ли. Иначе кракозябры, но получил.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 24.12.2009, 11:17
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Попробуй к опциям сборки добавить --enable-msdblib
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rusvid
  опции профиля:
сообщение 25.12.2009, 11:15
Сообщение #7


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 21.12.2009
Пользователь №: 1323

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Tonal @ 24.12.2009, 15:17) *
Попробуй к опциям сборки добавить --enable-msdblib

Подскажи, плиз, поподробнее, что именно собирать ? свое приложение ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 29.12.2009, 7:57
Сообщение #8


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Собирать FreeTDS.
Я, когда возился, со связкой FreeTDS + PyMSSQL то кодировку пришлось в win1251 выставить - с utf-8 не работало. :(
Но это было ещё на FreeTDS версии 0.6.х.
Как сейчас - не разбирался.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 18:47