免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 11584 | 回复: 28
打印 上一主题 下一主题

请教linux系统中如何通过ODBC访问远端SQL SERVER数据库 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-11-05 11:39 |只看该作者 |倒序浏览
我现在在做linux下的odbc数据库编程,需要通过odbc接口访问远端的SQL SERVER数据库,现在我下载了unixODBC-2.2.1.tar为ODBC数据源管理器,freetds作为SQL SERVER的客户端驱动,可是连接出现错误,不知道有没有其他方法可以解决linux下通过odbc数据源访问远断SQL SERVER数据库(最好所需软件是免费,因为是自己用*_*),谢谢!

论坛徽章:
0
2 [报告]
发表于 2003-11-05 12:03 |只看该作者

请教linux系统中如何通过ODBC访问远端SQL SERVER数据库

推荐你直接使用freetds来连接,这样比较简单,反正你只是需要访问数据库,并且odbc的程序也是要你自己写的。我当时用freetds来连接sybase数据库,感觉使用起来还是很简单的。

论坛徽章:
0
3 [报告]
发表于 2003-11-05 14:24 |只看该作者

请教linux系统中如何通过ODBC访问远端SQL SERVER数据库

直接使用FREETDS连接?不太明白,能说详细些么?

论坛徽章:
0
4 [报告]
发表于 2003-11-06 00:33 |只看该作者

请教linux系统中如何通过ODBC访问远端SQL SERVER数据库

[quote]原帖由 "haricot"]直接使用FREETDS连接?不太明白,能说详细些么?[/quote 发表:

freetds本身就能够连接sql server数据库。我用他来查询sybase数据库。由于历史上的原因,sql server的底层其实是MS从sybase公司买来的。所以,freetds既能连接sybase,也能够连接sql server。

我当时其实就是把freetds里面的一个应用程序的代码稍微修改了一下,就能够连接sybase来进行查询了。具体的该文件的位置为freetds-0.61.2/src/apps/tsql.c。你可以编译该文件然后学会如何使用。一般情况下你直接调用
tsql -H host_ip_address -p host_port -U username -P passwd
这里host_ip_address就是你sql server服务器的ip地址,host_port是sql server的端口号,sybase默认是5000,如果我没猜错,sql server应该也是。username和passwd应该不用说了。tsql这个工具有一点问题就是如果passwd为空就无法登录,你可以自己修改代码来解决这个问题。
我想你把这个tsql.c文件好好看看,就应该会知道如何使用freetds的函数库了。比较简单的。如果还有什么问题,可以发mail或者message来问我。

论坛徽章:
0
5 [报告]
发表于 2003-11-06 15:07 |只看该作者

请教linux系统中如何通过ODBC访问远端SQL SERVER数据库

不知道在使用FREETDS访问远端数据库时,时不时必需在freetds.conf文件中增加一条相关信息

论坛徽章:
0
6 [报告]
发表于 2003-11-06 16:36 |只看该作者

请教linux系统中如何通过ODBC访问远端SQL SERVER数据库

如果直接指定server_ip和port,是不需要配置freetds.conf文件的。我就是直接在代码中指定IP和PORT来访问数据库的。

论坛徽章:
0
7 [报告]
发表于 2003-11-06 16:40 |只看该作者

请教linux系统中如何通过ODBC访问远端SQL SERVER数据库

我对数据库的操作基本上的代码如下,自己感觉写的不好,见笑了。

  1. #ifndef __SYBASE_H__
  2. #define __SYBASE_H__

  3. class SYDatabase {
  4. public:
  5.         SYDatabase(void);
  6.         ~SYDatabase(void);
  7. public:
  8.         int Initial(void);
  9.         int Connect(const char *host, int port, const char *username, const char *passwd);
  10.         void Disconnect(void);
  11.         friend class SYRecordSet;
  12. protected:
  13.         void *m_tds;
  14.         void *m_login;
  15.         void *m_context;
  16. };

  17. #endif /* __SYBASE_H__ */
复制代码


  1. #include <stdio.h>;
  2. #include <unistd.h>;
  3. #include <stdlib.h>;
  4. #include <string.h>;
  5. #include <locale.h>;
  6. #include <sys/time.h>;
  7. #include <time.h>;
  8. #include <assert.h>;

  9. #include <tds.h>;
  10. #include <tdsconvert.h>;
  11. #include "sybase.h"

  12. SYDatabase::SYDatabase()
  13. {
  14.         m_tds = NULL;
  15.         m_login = NULL;
  16.         m_context = NULL;
  17. }

  18. SYDatabase::~SYDatabase()
  19. {
  20.         Disconnect();
  21. }

  22. int
  23. tsql_handle_message(TDSCONTEXT * context, TDSSOCKET * tds, TDSMSGINFO * msg)
  24. {
  25.         if (msg->;msg_number == 0) {
  26.                 fprintf(stderr, "%s\n", msg->;message);
  27.                 return 0;
  28.         }

  29.         if (msg->;msg_number != 5701 && msg->;msg_number != 20018) {
  30.                 fprintf(stderr, "Msg %d, Level %d, State %d, Server %s, Line %d\n%s\n",
  31.                         msg->;msg_number, msg->;msg_level, msg->;msg_state, msg->;server, msg->;line_number, msg->;message);
  32.         }

  33.         return 0;
  34. }

  35. int SYDatabase::Initial(void)
  36. {
  37.         TDSLOGIN *login = NULL;
  38.         TDSCONTEXT *context = NULL;
  39.        
  40.         do {
  41.                 login = tds_alloc_login();
  42.                 if (!login)
  43.                         break;
  44.                 context = tds_alloc_context();
  45.                 if (!context)
  46.                         break;
  47.                 if (context->;locale && !context->;locale->;date_fmt){
  48.                         context->;locale->;date_fmt = strdup("%Y%m%d");
  49.                 }
  50.                 context->;msg_handler = tsql_handle_message;
  51.                 context->;err_handler = tsql_handle_message;
  52.                 m_login = (void*)login;
  53.                 m_context = (void*)context;
  54.                 return 0;
  55.         }while(0);
  56.         if (login)
  57.                 tds_free_login(login);
  58.         if (context)
  59.                 tds_free_context(context);
  60.         return -1;
  61. }               

  62. int SYDatabase::Connect(const char *host, int port, const char *user, const char *passwd)
  63. {
  64.         TDSLOGIN *login = (TDSLOGIN*)m_login;
  65.         TDSCONTEXT *context = (TDSCONTEXT*)m_context;
  66.         TDSSOCKET *tds = NULL;
  67.         TDSCONNECTINFO *connect_info = NULL;
  68.         do {
  69.                 if (!login || !context)
  70.                         break;
  71.                 tds_set_user(login,user);
  72.                 tds_set_app(login,"SYDATABASE_CLASS");
  73.                 tds_set_library(login,"TDS-Library");
  74.                 tds_set_server(login,host);
  75.                 tds_set_port(login,port);
  76.                 tds_set_charset(login,"roman8");
  77.                 tds_set_language(login,"us_english");
  78.                 tds_set_packet(login,512);
  79.                 tds_set_passwd(login,passwd);
  80.                 tds = tds_alloc_socket(context,512);
  81.                 if (!tds)
  82.                         break;
  83.                 tds_set_parent(tds,NULL);
  84.                 connect_info = tds_read_config_info(NULL,login,context->;locale);
  85.                 if (!connect_info || tds_connect(tds, connect_info) == TDS_FAIL)
  86.                         break;
  87.                 tds_free_connect(connect_info);
  88.                 m_tds = (void*)tds;
  89.                 return 0;
  90.         }while(0);
  91.         if (connect_info)
  92.                 tds_free_connect(connect_info);
  93.         if (tds)
  94.                 tds_free_socket(tds);
  95.         return -1;
  96. }

  97. void SYDatabase::Disconnect(void)
  98. {
  99.         if (m_tds){
  100.                 tds_free_socket((TDSSOCKET*)m_tds);
  101.                 m_tds = NULL;
  102.         }
  103.         if (m_login){
  104.                 tds_free_login((TDSLOGIN*)m_login);
  105.                 m_login = NULL;
  106.         }
  107.         if (m_context){
  108.                 tds_free_context((TDSCONTEXT*)m_context);
  109.                 m_context = NULL;
  110.         }
  111. }
复制代码

论坛徽章:
0
8 [报告]
发表于 2003-11-06 17:36 |只看该作者

请教linux系统中如何通过ODBC访问远端SQL SERVER数据库

我现在还是无法连接上远端数据库,情况如下:
# tsql -H 202.112.109.114 -p 5000 -U helitech -P 123456
locale is "zh_CN.GB18030"
charset is "GB18030"
src/tds/login.c: tds_connect: 202.112.109.114:5000: 拒绝连接
Msg 20009, Level 9, State 0, Server OpenClient, Line 0
Server is unavailable or does not exist.
There was a problem connecting to the server

# tsql -S MyServer2000 -p 1433 -U helitech -P 123456
locale is "zh_CN.GB18030"
charset is "GB18030"
There was a problem connecting to the server

不知道是哪里出了问题.

论坛徽章:
0
9 [报告]
发表于 2003-11-06 23:04 |只看该作者

请教linux系统中如何通过ODBC访问远端SQL SERVER数据库

应该是端口不对。你应该在你的sql server服务器上面察看一下侦听端口是多少?
可以用这个指令netstat -na | find "LISTENING"
可以看到服务器上面打开的端口号。对sql server不熟悉,我去看看freetds的主页

论坛徽章:
0
10 [报告]
发表于 2003-11-06 23:15 |只看该作者

请教linux系统中如何通过ODBC访问远端SQL SERVER数据库

我察看了一下freetds的主页,我想你需要去确认两点,第一,ms sql的侦听端口到底是多少?第二,ms sql的Authentication的类型。你需要standard security的认证类型。这种类型使用起来应当相对简单。
具体的内容你可以去察看freetds的FAQ和User Guide。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP