我在windows2003下装的mysql服务器,想要在linux系统下连接该服务器。我在linux系统中安装了mysql-connector-odbc以及unixODBC,然后通过连接字符串连接时提示错误:Data source name not found, and no default driver specified。是因为我没有配置odbc的数据源吧?
请问linux下mysql odbc的数据源如何配置?我google了一些,可是也不太清楚,请高人指教,谢谢。
请问linux下mysql odbc的数据源如何配置?我google了一些,可是也不太清楚,请高人指教,谢谢。
希望你安装的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>
~
这样的连接字符串在windows下是没有问题的,不知道linux下有没有什么区别呢?另外,我的连接字符串的驱动是{MySQL ODBC 5.1 Driver},这个名字是在connector安装好之后就确定的吗?需不需要在配置数据源的时候做一些修改呢?我刚刚接触mysql,请指教,谢谢
请注意仔细看我上边的示例,我注册使用的Driver名字是MySQL,不是MySQL ODBC 5.1 Driver。Driver Name和Driver Description是两码事。不要被Windows下的那个名字蒙骗了,名字是可以改的。看来你还是没有弄懂ODBC实现的基本原理。
另外我还发现一个问题,我的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
-v选项会告诉你详细的出错原因。这个通了,才走下一步。
另外,你的动态库用的好像是要调用unicode ODBC api.如果是driver不能工作,只能换一个低版本的driver了。 你的unixODBC版本,推荐使用2.2.11.
我用isql测试,连接成功。
用连接字符串来连接数据库,字符串是:DRIVER={MySQL ODBC 3.51 Driver};DSN=mylas;UID=root;PWD=;
mylas已经配置,用isql测试连接成功。在代码中使用连接字符串连接数据库时,提示Invalid window handle,查了一下,是我使用的API函数需要传递一个window handle参数,这个参数似乎不支持linux平台。
这样,在linux下还有其他方法是用连接字符串来连接数据库吗,还是只能尝试其他的连接方法呢?
代码:
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++的代码,我是用这个来访问数据库的。
换成SQL_DRIVER_NOPROMPT之后,是这个错误:
[unixODBC][MySQL][ODBC 3.51 Driver]Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
你的连接串肯定有问题啊。
你还是先弄通连接串吧。
这样可以了,呵呵。
之前是写成DRIVER={MySQL ODBC 3.51 Driver};DSN=mylas;UID=root;PWD=;
我以为这里指定了DSN,而这个mylas的DSN里面也配置了数据源的各种信息,是可以连接的呢,原来不可以。我之前看了SQLDriverConnect函数的一些说明文档,应该有一些理解错误。非常感谢iihero的帮助,终于解决了这个问题。看来我要学习的东西还有很多很多。
我是在前人的基础上修改,前面就用的libodbc++,我也没有办法。
继续学习了!感谢!
给分!