win7 64位,在ODBC的DNS中对sql server配置成功,但连接失败

waterhill 2012-10-29 12:42:42
win7 64位下,在ODBC的DNS中对sql server 2008配置成功,但连接时失败;
但在32下却能连接成功。
64位下,错误提示为:Message: '[Microsoft][ODBC 驱动程序管理器] 无效的字符串或缓冲区长度'

网上查了下相关的解决方法,如下:

win2003 64位系统下ODBC连接使用 转自win2003 64位系统下ODBC连接使用

环境

一般系统部署的服务器若是windows系统,就会采用64位win2003的结构。可是我们编写的程序绝大多数都是在x86下32位cpu架构中 编译的,要正常移植到64位机器还真的是很麻烦,不仅要求应用程序是64位模式编译,还需要数据库也得是64位,iis64位,framework64 位,好在相应的厂商都提供这些支持组件。不知道有人遇到过像我这样的问题么,应用中有需要增加一个Access数据库导入功能,这就需要连接ODBC的 mdb驱动,可是Microsoft OLE DB Provider for Jet不支持64位系统,即使安装了office2007后,发现ODBC也没有任何变化,这下尴尬了。

分析
对64位系统结构进行分析。

1.c盘下有两个程序安装目录:Program Files和Program Files (x86);
2.windows文件夹下有两个目录:System32和SysWOW64;
在System32中的odbcad32.exe中没有其他驱动(这也是控制面板中ODBC直接启动的程序),但是在SysWOW64下的 odbcad32.exe却存在mdb之类的所有驱动,这说明ODBC驱动在操作系统中是存在的,只是因为运行模式导致调用的odbc程序不同,造成找不 到对应的驱动。了解到这一点,就能找到解决方案:切换64位运行模式为32位。

解决步骤

切换IIS运行模式为32位
开始→运行→cmd,运行脚本:cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 1,即可将IIS由64位切换为32位模式;若想恢复为64位模式,运行脚本:cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 0。若脚本报错,切换路径为C:\Inetpub\AdminScripts,因为adsutil.vbs文件在该路径下。

Asp.net运行模式为32位
重新注册asp.net,开始→运行→cmd,运行脚本:%SYSTEMROOT%\Microsoft.NET\Framework \v2.0.40607\aspnet_regiis.exe -i。若要注册64位,脚本为:%SYSTEMROOT%\Microsoft.NET\Framework64\v2.0.40607 \aspnet_regiis.exe -i。

重启机器,IIS即可运行32位的程序,ODBC的连接也生效了。



我按照该方法试了下:
1、“切换IIS运行模式为32位”成功;
2、“Asp.net运行模式为32位”失败,提示“该错误指示相应计算机上没有安装 IIS。请在使用此工具前安装 IIS”
就没有尝试顺着这个路往下查找以解决

相信很多同学遇到类似的问题吧,
高手能否帮解决下,谢谢先~
55分全部奉献啦。。。
...全文
8970 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
forko 2014-09-29
  • 打赏
  • 举报
回复
Matlab 2013b 轻松取到Handle Matlab 2013a 出现错误---[Microsoft][ODBC 驱动程序管理器] 无效的字符串或缓冲区长度 解决方法:2个都安装(貌似现在编译dll 只能用2013a)
johnlove9527 2014-07-18
  • 打赏
  • 举报
回复
引用 8 楼 waterhill 的回复:
Matlab通过JDBC连接SQL Server "D:\Matlab2010B\toolbox\local\classpath.txt",在文件的最后加入sqljdbc4.jar的完整路径,例如我的是: "D:/sqljdbc30/enu/sqljdbc4.jar",注意斜杠怎么写。 第三步,启动Matlab,启动过程中如果没有出错,那么这个JDBC Connector就可以用了。 上面三步就把JDBC Connector建好了。接下来我们就开始连接数据库。 第一步,建立一个到数据库的连接。假设SQL Server地址是 192.30.1.117, 端口是 1433, 数据库名称是RTQ,用户名user,密码 pwd,那么用下面的语句建立一个到该数据库的连接。 conn=database('RTQ','user','pwd','com.microsoft.sqlserver.jdbc.SQLServerDriver',... 'jdbc:sqlserver://192.30.1.117:1433;databaseName=RTQ'); 需要说明的是,实例中:databaseurl='jdbc:sqlserver://localhost:1433; 应该改为:databaseurl='jdbc:sqlserver://localhost:1433;databaseName=Test'; 否则,最后连接的数据库不是Test,而是系统数据库(猜测的),且上句的数据库名字应该与之前指定的数据源一致才行。 以上已经在win7,sql server 2008 R2,2012a(三者均是64位)的平台上测试成功, 希望对其他同学有所帮助
求救下楼主,我的是在2008b的matlab,sql2008,win764的平台下,为什么出现句柄获取不到的问题。 conna = Instance: 'zjhddata2' UserName: 'USER-20140710UM\Administrator' Driver: [] URL: [] Constructor: [1x1 com.mathworks.toolbox.database.databaseConnect] Message: [1x154 char] Handle: 0 TimeOut: [] AutoCommit: 'off' Type: 'Database Object' 能不能加好友,请教下。
星际飞龙2013 2014-03-20
  • 打赏
  • 举报
回复
运行另一个ODBC配置程序就能解决:http://blog.csdn.net/kzl623/article/details/6310385
slothland 2013-03-06
  • 打赏
  • 举报
回复
还有: 这个软件在 这台win7 64 上,一开始是可以运行的。 突然, 就出了这个错误。 我认为是某个设置被改了。现在不知道是哪里需要改。
slothland 2013-03-06
  • 打赏
  • 举报
回复
我有同样的问题:
ODBC 设置成功。
我用VB6 写的软件在其他XP, WIN7 32 的机器上运行完全没问题。

但是WIN7 64 就出错。

请大牛指点

我的连接是这样的

strConnect = "Provider=SQLOLEDB.1" _
& ";User ID=" & id & "" _
& ";Password=" & pass & "" _
& ";Initial Catalog=" & cata & "" _
& ";Data Source=" & Source & ""
Mr_Nice 2012-11-23
  • 打赏
  • 举报
回复
matlab 膜拜...
wxzynhxh 2012-11-23
  • 打赏
  • 举报
回复
嗯,谢谢!就是引用数据库时,出现了问题,找不到数据库中的表。
發糞塗牆 2012-11-18
  • 打赏
  • 举报
回复
引用 9 楼 wxzynhxh 的回复:
请教一下,我执行curs=fetch(curs);时的提示是这个,是什么原因呢?求助。 Undefined function or method 'fetch' for input arguments of type 'struct'.
这个问题你要考虑一下是否少了架构名,比如我写了个函数叫A,直接调用会说不存在,然后我加了DBO.A调用就可以了
waterhill 2012-11-17
  • 打赏
  • 举报
回复
引用 10 楼 wxzynhxh 的回复:
找到原因了,数据库里的设置问题。不支持我输入的IP。
en,解决后把方法讲出来的习惯不错,支持~
發糞塗牆 2012-11-04
  • 打赏
  • 举报
回复
晕,缓存请一下才能进新论坛.....
wxzynhxh 2012-11-03
  • 打赏
  • 举报
回复
找到原因了,数据库里的设置问题。不支持我输入的IP。
wxzynhxh 2012-11-03
  • 打赏
  • 举报
回复
请教一下,我执行curs=fetch(curs);时的提示是这个,是什么原因呢?求助。 Undefined function or method 'fetch' for input arguments of type 'struct'.
waterhill 2012-11-01
  • 打赏
  • 举报
回复
隔了两天,还是想把问题解决,因为32位机器内存太小了,大数据没法读,今天偶而搜到一遍文章《Matlab通过ODBC连接SQL Server两种方法:程序设计方法和图形界面设计方法》-作者 Godman,没猜错的话,应该是杭州的老朋友写的,之前向他请教过不少问题,且还请过吃过饭,在此一并谢过~

具体解决方法转载如下:
(ODBC方法略,只针对JDBC方法)
Matlab通过JDBC连接SQL Server
上一篇写的是通过ODBC连接SQL Server,那种方法存在两大问题,
第一是速度慢,因为Matlab需要用一个叫做JDBC/ODBC Bridge的东西作为桥梁间接地连接ODBC数据库,因此速度肯定比JDBC要慢。如果说慢一点可以容忍的话,那么第二个问题可就忍无可忍了。那就是64位Matlab无法通过ODBC接口访问SQL Server--因为这个悲剧,我还不得不新安装一个32位的Matlab!
既然ODBC那么不爽,我们可以跳出ODBC,而直接使用JDBC来访问数据库。
第一步,从Microsoft.COM 下载Microsoft SQL Server JDBC Driver 3.0,下载地址可以将上述关键字扔进Google中搜索就得到了。解压缩可以得到很多文件,我们需要的是其中的sqljdbc4.jar和sqljdbc.jar这两个文件。
其中后者是前者的子集,只要不出问题,直接使用前者就可以了。
第二步,在Matlab中加入jar。具体做法是找到"classpath.txt"文件,例如我的这个文件位置是 "D:\Matlab2010B\toolbox\local\classpath.txt",在文件的最后加入sqljdbc4.jar的完整路径,例如我的是: "D:/sqljdbc30/enu/sqljdbc4.jar",注意斜杠怎么写。
第三步,启动Matlab,启动过程中如果没有出错,那么这个JDBC Connector就可以用了。
上面三步就把JDBC Connector建好了。接下来我们就开始连接数据库。
第一步,建立一个到数据库的连接。假设SQL Server地址是 192.30.1.117, 端口是 1433, 数据库名称是RTQ,用户名user,密码 pwd,那么用下面的语句建立一个到该数据库的连接。
conn=database('RTQ','user','pwd','com.microsoft.sqlserver.jdbc.SQLServerDriver',...
'jdbc:sqlserver://192.30.1.117:1433;databaseName=RTQ');
第二步,建立一个查询,假设我们想获得名叫 tbl 的table中的所有顺序,那么可以用:
curs=exec(conn,'select * from tbl');
第三步,获取数据
curs=fetch(curs);
获取的数据就储存在 curs.Data 中。如果我们想将其保存到xls文件中,可以使用
xlswrite('data.xls',curs.Data);
依据测试,在我的Win 7 Professional x64, Matlab 2010B x64 系统上成功获取了数据,但是速度测试不太好做,因为可能与数据库本身的速度有关。我从三个数据库分别下载70万行左右的数据,使用时间在10到25秒不等。
在Matlab用JDBC驱动连接SQL Server 2008(其他仅连接符url和driver不同)
%在运行此段代码前先确保配置好了JDBC驱动,方法如下:
%1.Microsoft官网下载sqljdbc3.0驱动——Microsoft SQL Server JDBC Driver 2.0.exe(4M左右)
%2.解压后能看到sqljdbc4.jar和sqljdbc.jar文件,针对电脑上JDK的版本选择导入文件,如JDK6.0导入sqljdbc4.jar
%3.在command windows中输入:edit classpath.txt 打开路径配置文件 在文件最后一行添加sqljdbc4.jar的完整路径,
%(不能同时加载sqljdbc4.jar和sqljdbc.jar的路径,否则不能正常连接数据库)。
%4.在SQL Server中新建一个登录名godman,并设置密码为godman
%5.采用如下代码在Matlab中连接SQL Server 2008
%Godman 2010.12.20 tntuyh@163.com
代码如下:
clear;close all
%url
databaseurl='jdbc:sqlserver://localhost:1433;';
%driver
driver='com.microsoft.sqlserver.jdbc.SQLServerDriver';
username='godman'; %登录名
password='godman'; %密码
databasename='Test'; %数据源名称
conn = database(databasename,username,password,driver,databaseurl)

tic
curs=exec(conn,'select * from 处理前数据')
curs=fetch(curs); %将SQL执行结果返回到MATLAB工作空间
data=curs.Data; %得到SQL执行结果中的数据
toc
close(curs); %关闭游标对象
close(conn); %关闭数据库连接对象


%%===============================以上结束

需要说明的是,实例中:databaseurl='jdbc:sqlserver://localhost:1433;
应该改为:databaseurl='jdbc:sqlserver://localhost:1433;databaseName=Test';
否则,最后连接的数据库不是Test,而是系统数据库(猜测的),且上句的数据库名字应该与之前指定的数据源一致才行。

以上已经在win7,sql server 2008 R2,2012a(三者均是64位)的平台上测试成功,
希望对其他同学有所帮助
以学习为目的 2012-10-31
  • 打赏
  • 举报
回复
帮顶,没遇到过
waterhill 2012-10-31
  • 打赏
  • 举报
回复
自己顶下,难得没人知道怎么解决吗。。。
waterhill 2012-10-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

看问题具体像是ODBC的问题哦
[/Quote]

en,估计是,同样的代码,在win7 32位下,可以拿到句柄的,
帮顶下哈,或许有高手看到呢。。。
發糞塗牆 2012-10-29
  • 打赏
  • 举报
回复
看问题具体像是ODBC的问题哦
waterhill 2012-10-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

没遇到过,帮顶算了
[/Quote]
谢谢,
网上有人提出过类似的问题,如:

发表于 2011-4-14 13:47:25 |只看该作者 |倒序浏览

请教专家:
在用matlab取SQL server的数据时报错:[Microsoft][ODBC 驱动程序管理器] 无效的字符串或缓冲区长度 Please verify that login information and database url are valid.
我装的matlab版本是2010b(64位),32位没有这个问题,我的操作系统和SQL都是64位的,AccessDatabaseEngine装了64位的也没解决问题,请问各位专家这是什么原因,非常感谢!
具体见:http://www.ilovematlab.cn/thread-122054-1-1.html


但貌似都没人回答啊。。。
發糞塗牆 2012-10-29
  • 打赏
  • 举报
回复
没遇到过,帮顶算了
waterhill 2012-10-29
  • 打赏
  • 举报
回复
重装系统win7 64bit后,再安装sql server 2008R2 64位及matlabR2012a 64位后,在odbc中配置成功,但在matlab下对数据访问时出错,具体如下:
matlab 语句:conn=database(sourceName,'sa',key);
1、当三个参数均与odbc配置一致,此时提示错误为:
Message: '[Microsoft][ODBC 驱动程序管理器] 无效的字符串或缓冲区长度'
2、当sourceName故意更改后,提示错误为:
Message: '[Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序'
3、当密码key故意更改后,提示错误为:
Message: '[Microsoft][ODBC SQL Server Driver][SQL Server]用户 'sa' 登录失败。'

以上综合说明,matla与odbc的接口连接没问题,但odbc配置成功了,说明其与sql sever连接貌似也没问题,
但为啥最终仍然无法连接成功啊。。。

难道大家没有遇到类似的问题么?有高手没~~
以上在32位系统下均没问题

22,301

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧