LINUX.ORG.RU

Как открыть базу MSSQL, у которой имя - на русском, через FreeTDS ODBC ?


0

0

Вот что выдает моя отладочная программа:
$ ./test
ODBC Version: 0351,0300
SQLAllocHandle: 0
SQLSetEnvAttr: 0
SQLAllocHandle: 0
SQLDriverConnect: -1
ConnectionString: books
 ErrorMsg=[unixODBC][FreeTDS][SQL Server]Login incorrect.
 ErrorCode=20014
 nResult=0
....

Вот что выдает стандартный клиент:
$ isql -v books
[S1000][unixODBC][FreeTDS][SQL Server]Unable to connect to data source
[28000][unixODBC][FreeTDS][SQL Server]Login incorrect.
[08S01][unixODBC][FreeTDS][SQL Server]Read from SQL server failed.
[ISQL]ERROR: Could not SQLConnect

Вот настройки драйверов и соединений:
/etc/odbc.ini:
[books]
Description = Books in Herzenlib
Driver = FreeTDS
ServerName = SQLServer
Database = Книги
UID = sa
PWD = 

/etc/odbcinst.ini:
[FreeTDS]
Description = TreeTDS driver
Driver = /usr/lib/odbc/libtdsodbc.so

/etc/freetds/freetds.conf:
[SQLServer]
host = 192.168.0.25
port = 1433
tds version = 8.0
;client charset = UTF-8 ; эта строчка тоже не помогает
client charset = WINDOWS-1251
★★★★★

Вот соответствующий кусок кода:
test.c:
...
  printf("ODBC Version: %04X,%04X\n",ODBCVER,0x0300);
  // выделение environment handle
  nResult = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);
  printf("SQLAllocHandle: %d\n",nResult);
  nResult = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
  printf("SQLSetEnvAttr: %d\n",nResult);
  // выделение connection handle
  nResult = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDBC);
  printf("SQLAllocHandle: %d\n",nResult);
  nResult = SQLConnect(hDBC, (SQLTCHAR *)szDSN, SQL_NTS, (SQLTCHAR *)szUsername, SQL_NTS, (SQLTCHAR *)szPassword, SQL_NTS);
  printf("SQLDriverConnect: %d\n",nResult);
  printf("ConnectionString: %s\n",szDSNout);
  printMessage(SQL_HANDLE_DBC, hDBC);
----

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

По историческим причинам :)
Эх ... видимо придется все базы переименовывать по-нормальному.

pacify ★★★★★
() автор топика

Насчет русского незнаю, а когда тым были пробелы вроде в квадратный скобки брать приходилось.

Ну а вообще конечно лучше дать люлей тому кто использовал русское имя

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

Кстати, pymssql через Free TDS работает с русскими именами баз в кодировке Windows-1251.
Виндовый ODBC32 тоже работает с ними в кодировке Windows-1251.
То есть проблема в unixODBC, который не может правильно составить запрос.

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

Ясен пень - это же UNIX, там кодировка раньше была для русского KOI-8, а сейчас UTF-8 обычно используют. 1251 - это только у нас придумали в форточках naikersзаместо 866

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