我在windows2003下装的mysql服务器,想要在linux系统下连接该服务器。我在linux系统中安装了mysql-connector-odbc以及unixODBC,然后通过连接字符串连接时提示错误:Data source name not found, and no default driver specified。是因为我没有配置odbc的数据源吧?
请问linux下mysql odbc的数据源如何配置?我google了一些,可是也不太清楚,请高人指教,谢谢。

解决方案 »

  1.   

    看你的错误提示,你的unixODBC以及libmyodbc相必都已经安装好了。那就开始手配吧。
    希望你安装的unixODBC的默认系统配置文件在/etc/odbcinst.ini和/etc/odbc.ini下边。你的libmyodbc的库文件在:编辑/etc/odbcinst.ini, 加入:
    [MySQL]
    Description     = MySQL driver
    Driver          = /usr/lib/odbc/libmyodbc.so
    Setup           = /usr/lib/odbc/libodbcmyS.so
    CPTimeout       =
    CPReuse         =
    确保Driver和Setup这两个动态库的位置与你安装的位置相符。
    编辑/etc/odbc.ini, 加入:
    [myodbc]
    Driver       = MySQL
    SERVER       = 192.168.1.3
    PORT         =
    USER         = test
    Password     = 
    Database     = test
    OPTION       = 3
    SOCKET       =
    Server是你位于2003下的机器的IP地址。
    然后保存。运行如下命令进行验证:
    root@seanlinux:/home/iihero/ODBC/samples# isql myodbc test xiong_he -v
    +---------------------------------------+
    | Connected!                            |
    |                                       |
    | sql-statement                         |
    | help [tablename]                      |
    | quit                                  |
    |                                       |
    +---------------------------------------+
    SQL> show tables;
    +-----------------------------------------------------------------+
    | Tables_in_test                                                  |
    +-----------------------------------------------------------------+
    | abc                                                             |
    | employees                                                       |
    | foo                                                             |
    | guestbook                                                       |
    | t                                                               |
    | t_defaultdate                                                   |
    | tblob                                                           |
    | test_null                                                       |
    | test_num                                                        |
    +-----------------------------------------------------------------+
    9 rows fetched
    SQL> select * from t;
    +---------------------------------------------------+-----------+
    | name                                              | no        |
    +---------------------------------------------------+-----------+
    | abc                                               | 2         |
    | fjdasklf                                          | 1         |
    | update                                            | 10        |
    | ??                                                | 10        |
    +---------------------------------------------------+-----------+
    SQLRowCount returns 4
    4 rows fetched
    SQL> set names 'gbk'
    SQLRowCount returns 0
    SQL> select * from t
    +---------------------------------------------------+-----------+
    | name                                              | no        |
    +---------------------------------------------------+-----------+
    | abc                                               | 2         |
    | fjdasklf                                          | 1         |
    | update                                            | 10        |
    | 宗过                                              | 10        |
    +---------------------------------------------------+-----------+
    SQLRowCount returns 4
    4 rows fetched
    SQL>
    ~
      

  2.   

    谢谢。按照楼上的回复,我修改了这两个文件,可是还是相同的错误提示。我是用连接字符串来连接的,连接字符串是这样:Driver={MySQL ODBC 5.1 Driver};Server=192.168.12.145;Database=test;User=root;Password=;
    这样的连接字符串在windows下是没有问题的,不知道linux下有没有什么区别呢?另外,我的连接字符串的驱动是{MySQL ODBC 5.1 Driver},这个名字是在connector安装好之后就确定的吗?需不需要在配置数据源的时候做一些修改呢?我刚刚接触mysql,请指教,谢谢
      

  3.   

    如果你使用连接串,那应该用:Driver={MySQL}; .....
    请注意仔细看我上边的示例,我注册使用的Driver名字是MySQL,不是MySQL ODBC 5.1 Driver。Driver Name和Driver Description是两码事。不要被Windows下的那个名字蒙骗了,名字是可以改的。看来你还是没有弄懂ODBC实现的基本原理。
      

  4.   

    iihero:你好,我是刚刚接触数据库的东西,还请多多指教。如果用连接字符串连接,应该就不需要修改odbc.ini这个文件吧,连接字符串的作用和这个文件的作用是一样的吧?
    另外我还发现一个问题,我的Driver对应的动态库是libmyodbc5.so,用ld看了一下,有下面的提示信息:
    libmyodbc5-5.1.5.so: undefined reference to `SQLWriteDSNToIniW'
    libmyodbc5-5.1.5.so: undefined reference to `SQLRemoveDSNFromIniW'
    libmyodbc5-5.1.5.so: undefined reference to `SQLValidDSNW'
    libmyodbc5-5.1.5.so: undefined reference to `SQLWritePrivateProfileStringW'
    libmyodbc5-5.1.5.so: undefined reference to `SQLPostInstallerErrorW'
    是不是我的环境配置的还有问题呢?
    我的linux是redhat as4,安装的是mysql-connector-odbc-5.1.5-0.i386.rpm以及unixODBC-2.2.3-6.i386.rpm
      

  5.   

    在你配置完以后,为什么不用unixodbc自带的isql试一下是否能连呢? 
    -v选项会告诉你详细的出错原因。这个通了,才走下一步。
    另外,你的动态库用的好像是要调用unicode ODBC api.如果是driver不能工作,只能换一个低版本的driver了。 你的unixODBC版本,推荐使用2.2.11.
      

  6.   

    从链接出错的情况来看,应该是你的libmyodbc与unixodbc的符号库不匹配。
      

  7.   

    iihero:你好
    我用isql测试,连接成功。
    用连接字符串来连接数据库,字符串是:DRIVER={MySQL ODBC 3.51 Driver};DSN=mylas;UID=root;PWD=;
    mylas已经配置,用isql测试连接成功。在代码中使用连接字符串连接数据库时,提示Invalid window handle,查了一下,是我使用的API函数需要传递一个window handle参数,这个参数似乎不支持linux平台。
    这样,在linux下还有其他方法是用连接字符串来连接数据库吗,还是只能尝试其他的连接方法呢?
      

  8.   

    你用的是SQLDriverConnect,对吗?传一个NULL的window handle进去就可以的。你不妨把你的代码由贴出来看看。简单几行就能说明问题。
      

  9.   

    我是用的SQLDriverConnect函数,传了NULL进去,可是还是提示Invalid window handle。
    代码:
    void Connection::_connect(const ODBCXX_STRING& connectString)
    {
      ODBCXX_SQLCHAR dummy[256];
      SQLSMALLINT dummySize;
      SQLRETURN r=SQLDriverConnect(hdbc_,
           NULL,
           (ODBCXX_SQLCHAR*) ODBCXX_STRING_DATA(connectString),
           ODBCXX_STRING_LEN(connectString),
           dummy,
           255,
           &dummySize,
           SQL_DRIVER_COMPLETE);  this->_checkConError(hdbc_,r,ODBCXX_STRING_CONST("Failed to connect to datasource"));  driverInfo_=new DriverInfo(this);
    }
    这是libodbc++的代码,我是用这个来访问数据库的。
      

  10.   

    用SQLConnect函数是可以的,可是我更想用连接字符串来连接数据库,不知道有没有什么办法
      

  11.   

    中间的参数SQL_DRIVER_COMPLETE不对,应该使用SQL_DRIVER_NOPROMPT
      

  12.   

    要疯了
    换成SQL_DRIVER_NOPROMPT之后,是这个错误:
    [unixODBC][MySQL][ODBC 3.51 Driver]Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
      

  13.   

    sigh,很简单的一个问题啊。你明明是要连接到win2003上的mysql啊,怎么到了你这儿变成了连接local MySQL server??????????
    你的连接串肯定有问题啊。
    你还是先弄通连接串吧。
      

  14.   

    我把连接字符串改成:DRIVER={MySQL ODBC 3.51 Driver};UID=%s;PWD=%s;SERVER=192.168.12.145;Database=lasdb;
    这样可以了,呵呵。
    之前是写成DRIVER={MySQL ODBC 3.51 Driver};DSN=mylas;UID=root;PWD=;
    我以为这里指定了DSN,而这个mylas的DSN里面也配置了数据源的各种信息,是可以连接的呢,原来不可以。我之前看了SQLDriverConnect函数的一些说明文档,应该有一些理解错误。非常感谢iihero的帮助,终于解决了这个问题。看来我要学习的东西还有很多很多。
      

  15.   

    建议有空读读unixODBC的官方文档和源码。另外,ODBC API里头最基本的几个API的使用还是要弄清楚的。直接上来就用libodbc++,也不符合学习使用的原则。
      

  16.   

    呵呵
    我是在前人的基础上修改,前面就用的libodbc++,我也没有办法。
    继续学习了!感谢!
    给分!