SQL Server 2008 R2 调用MSScriptControl.ScriptControl失败

allanli 2013-10-25 05:06:40
在SQL Server 2000执行下面代码是可以返回COM对象的ID的

declare @intObject int
declare @intReturn int
declare @source varchar(255)
declare @description varchar(255)

exec @intReturn=master.dbo.[sp_oaCreate] 'MSScriptControl.ScriptControl',@intObject out
--exec master.dbo.[sp_oasetproperty] @intObject,'Language','vbscript'
EXEC master.dbo.[sp_OAGetErrorInfo] NULL, @source OUT, @description OUT

select @intReturn,@intObject,@source,@description

但到了SQL Server 2008 R2/windows Server 2008 X64 就不能返回对象ID了
错误信息是 没有注册类
那个有这样的环境测试一下

哎,升级一下数据库都这么多问题,晕死了,微软怎么老是弄这么多不兼容的东西了
今早好不容易解决了没有了xp_GetFileDetails的问题,现在又来这个
...全文
611 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
allanli 2014-06-19
  • 打赏
  • 举报
回复
引用 22 楼 tpriwzq 的回复:
MSScriptControl在x64位下有问题,也在找升级版
我找遍整个网络都没找到,最后还是自己写个CLR函数先解决问题吧 好在该功能不是经常用,慢点没所谓
「已注销」 2014-05-19
  • 打赏
  • 举报
回复
MSScriptControl在x64位下有问题,也在找升级版
Cloud_Hero 2013-10-28
  • 打赏
  • 举报
回复
我认为是你的MSScriptControl.ScriptControl控件在SQL Server 2008 R2下面存在兼容性问题。
LongRui888 2013-10-27
  • 打赏
  • 举报
回复
引用 15 楼 allanli 的回复:
[quote=引用 12 楼 yupeigu 的回复:] 还有就是,你的对应到clr程序集的函数的返回值类型,和传入参数类型,都是哪些数据类型呢
我就是使用MSScriptControl.ScriptControl做成一个标量函数传入一个字符串然后返回这个字符串的执行结果,用过java的Eval()函数就知道了,例如Eval('1+2*3+Sin(0.8)/Cos(0.3)') 公式可能很复杂的[/quote] 是这样吗:


select 1+2*3+Sin(0.8)/Cos(0.3)
/*
7.75089363702218
*/
LongRui888 2013-10-27
  • 打赏
  • 举报
回复
引用 10 楼 allanli 的回复:
[quote=引用 8 楼 yupeigu 的回复:] 上面的是win 7的64位,之前在xp上试过到是可以的
有没有办法解决啊,我一定要实现在SQL里面运行脚本语句啊!!! 因为我的脚本语句含有三角函数等一些复杂的函数,而且是动态脚本 没办法用SQL写解析器,那样太难了,一些简单的公式还可以自己解析运行 含有复杂的三角和数学函数的脚本没办法自己解析啊,哎,而且自己解析效率 比这个空间低很多[/quote] 你写个clr程序集,应该也可以的
allanli 2013-10-27
  • 打赏
  • 举报
回复
引用 12 楼 yupeigu 的回复:
还有就是,你的对应到clr程序集的函数的返回值类型,和传入参数类型,都是哪些数据类型呢
我就是使用MSScriptControl.ScriptControl做成一个标量函数传入一个字符串然后返回这个字符串的执行结果,用过java的Eval()函数就知道了,例如Eval('1+2*3+Sin(0.8)/Cos(0.3)') 公式可能很复杂的
allanli 2013-10-27
  • 打赏
  • 举报
回复
引用 13 楼 stublue 的回复:
可以试试用clr调用。net方法 参考 http://www.poluoluo.com/jzxy/200801/9462.html
CLR我会,但就算使用CLR编写自定义函数,也找不到比MSScriptControl.ScriptControl效率更高的办法 .NET到了3.5后也没有提供效率高的动态执行公式的类库,1.1时代有个vsa命名空间下的类可以使用 但到了2.0以后已不建议使用了,网上资料都是使用动态编译的办法,但这样效率太低了,我是要做成函数 嵌入到SQL语句执行的,动态编译效率根本没办法满足需求的
Leon_He2014 2013-10-27
  • 打赏
  • 举报
回复
可以试试用clr调用。net方法 参考 http://www.poluoluo.com/jzxy/200801/9462.html
LongRui888 2013-10-27
  • 打赏
  • 举报
回复
还有就是,你的对应到clr程序集的函数的返回值类型,和传入参数类型,都是哪些数据类型呢
LongRui888 2013-10-27
  • 打赏
  • 举报
回复
给你找了两个,你看看能用吗: http://download.csdn.net/detail/ddrvos/3546118 http://download.csdn.net/detail/llllllssssss12345678/4864859
LongRui888 2013-10-27
  • 打赏
  • 举报
回复
引用 10 楼 allanli 的回复:
[quote=引用 8 楼 yupeigu 的回复:] 上面的是win 7的64位,之前在xp上试过到是可以的
有没有办法解决啊,我一定要实现在SQL里面运行脚本语句啊!!! 因为我的脚本语句含有三角函数等一些复杂的函数,而且是动态脚本 没办法用SQL写解析器,那样太难了,一些简单的公式还可以自己解析运行 含有复杂的三角和数学函数的脚本没办法自己解析啊,哎,而且自己解析效率 比这个空间低很多[/quote] 哦 ,你的clr函数是标量函数吗,就是只返回一个值的
allanli 2013-10-27
  • 打赏
  • 举报
回复
引用 16 楼 yupeigu 的回复:
[quote=引用 10 楼 allanli 的回复:] [quote=引用 8 楼 yupeigu 的回复:] 上面的是win 7的64位,之前在xp上试过到是可以的
有没有办法解决啊,我一定要实现在SQL里面运行脚本语句啊!!! 因为我的脚本语句含有三角函数等一些复杂的函数,而且是动态脚本 没办法用SQL写解析器,那样太难了,一些简单的公式还可以自己解析运行 含有复杂的三角和数学函数的脚本没办法自己解析啊,哎,而且自己解析效率 比这个空间低很多[/quote] 你写个clr程序集,应该也可以的[/quote] .NET能动态解析公式的有什么现成的类库吗?好像没有吧 自己写对于复杂的含有函数的又有困难 动态编译虽然能解决问题,但效率太低没法用 如果没办法,只能要求公式的语法符合T-SQL写个CLR函数了
allanli 2013-10-27
  • 打赏
  • 举报
回复
引用 17 楼 yupeigu 的回复:
[quote=引用 15 楼 allanli 的回复:] [quote=引用 12 楼 yupeigu 的回复:] 还有就是,你的对应到clr程序集的函数的返回值类型,和传入参数类型,都是哪些数据类型呢
我就是使用MSScriptControl.ScriptControl做成一个标量函数传入一个字符串然后返回这个字符串的执行结果,用过java的Eval()函数就知道了,例如Eval('1+2*3+Sin(0.8)/Cos(0.3)') 公式可能很复杂的[/quote] 是这样吗:


select 1+2*3+Sin(0.8)/Cos(0.3)
/*
7.75089363702218
*/
[/quote] 不能用SQL执行的,我的公式不符合T-SQL语法的,这只是一个特例而已
allanli 2013-10-26
  • 打赏
  • 举报
回复
引用 8 楼 yupeigu 的回复:
上面的是win 7的64位,之前在xp上试过到是可以的
有没有办法解决啊,我一定要实现在SQL里面运行脚本语句啊!!! 因为我的脚本语句含有三角函数等一些复杂的函数,而且是动态脚本 没办法用SQL写解析器,那样太难了,一些简单的公式还可以自己解析运行 含有复杂的三角和数学函数的脚本没办法自己解析啊,哎,而且自己解析效率 比这个空间低很多
allanli 2013-10-26
  • 打赏
  • 举报
回复
引用 6 楼 ap0405140 的回复:
[quote=引用 3 楼 allanli 的回复:] 有注册的,因为我同一个系统同时安装了SQL Server 2000和SQL Server 2008 R2 同样的语句在SQL Server 2000可以正常运行返回值,但到SQL Server 2008就不行了 网上搜索了一下,好似系由于SQL Server 2008 X64造成的原因,说COM只能是exe程序,不会吧 有哪位有同样的环境的测试一下看看是否能成功返回ID值啊,这个功能我是必须要实现的 不然还有其他办法能够实现在SQL里面执行动态代码吗???
1.检查SQL2000服务启动帐号与SQL2008R2启动帐号是否一致,推荐用local system. 2.确认SQL2008R2系统选项Ole Automation Procedures是否为1.

sp_configure 'Ole Automation Procedures'
[/quote] 已经是打开这个开关的了,网上搜索了一天,看来是没有解决办法了,MSScriptControl.ScriptControl是没办法在X64位下运行的除非你用一个X64的程序重新打包改控件 如果不能使用,那么在SQL Server 2008 R2有什么替代办法替代MSScriptControl.ScriptControl呢
LongRui888 2013-10-26
  • 打赏
  • 举报
回复
上面的是win 7的64位,之前在xp上试过到是可以的
LongRui888 2013-10-26
  • 打赏
  • 举报
回复
我运行下面的:

sp_configure 'Ole Automation Procedures',1
go 
reconfigure
go


declare @intObject int
declare @intReturn int
declare @source		varchar(255)
declare @description 	varchar(255)

exec @intReturn=master.dbo.[sp_oaCreate] 'MSScriptControl.ScriptControl',@intObject out
--exec master.dbo.[sp_oasetproperty] @intObject,'Language','vbscript'
EXEC master.dbo.[sp_OAGetErrorInfo] NULL, @source OUT, @description OUT

select @intReturn,@intObject,@source,@description
也是没有注册类:
(无列名)	(无列名)	(无列名)	(无列名)
-2147221164	NULL	ODSOLE Extended Procedure	 没有注册类
唐诗三百首 2013-10-26
  • 打赏
  • 举报
回复
引用 3 楼 allanli 的回复:
有注册的,因为我同一个系统同时安装了SQL Server 2000和SQL Server 2008 R2 同样的语句在SQL Server 2000可以正常运行返回值,但到SQL Server 2008就不行了 网上搜索了一下,好似系由于SQL Server 2008 X64造成的原因,说COM只能是exe程序,不会吧 有哪位有同样的环境的测试一下看看是否能成功返回ID值啊,这个功能我是必须要实现的 不然还有其他办法能够实现在SQL里面执行动态代码吗???
1.检查SQL2000服务启动帐号与SQL2008R2启动帐号是否一致,推荐用local system. 2.确认SQL2008R2系统选项Ole Automation Procedures是否为1.

sp_configure 'Ole Automation Procedures'
Andy__Huang 2013-10-26
  • 打赏
  • 举报
回复
没用过这个东西,不知道是否有新版本?用过其他控件遇到过类似版本不兼容的问题,只是推测有可能是这个原因,没有绝对。
allanli 2013-10-26
  • 打赏
  • 举报
回复
引用 1 楼 hdhai9451 的回复:
估计是那个控件与64位系统存在兼容性问题,建议你找到这个控件'MSScriptControl.ScriptControl'更高的版本,注册它后再试用试试看.我觉得你方法应该没问题,是版本问题
MSScriptControl.ScriptControl 有X64的版本吗???
加载更多回复(3)

22,209

社区成员

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

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