2016-04-02 93 views
0

在有需要SQLAnywhere的(16)扩展的访问,其中DB运行在服务器上的一些DOS功能,我想:SQLAnywhere中的“外部CLR”如何访问一个系统进程

第一码的从Sybase调用DLL

________! !SAExternal.vb ____________

Imports System.Diagnostics 

Public Class SAExternal 
    Public Shared Function getDone() 
     Dim myProcess As Process = System.Diagnostics.Process.Start("notePad.exe", "C:\data\CLR\zTest.txt") 

     myProcess.WaitForExit() 
     myProcess.Close() 

     getDone = "OK" 
    End Function 
End Class 

使用编译:
VBC.EXE /吨:图书馆/out:SAExt.dll SAExternal.vb

遵循一些代码来测试我的DLL

_________! SAMain.vb ______________

Module SAMain 

    Sub Main() 
     Dim obj as New SAExternal() 

     MsgBox("Test SAMain " & obj.getDone()) 
    End Sub 

End Module 

使用编译:VBC.EXE /吨:winexe /r:SAExt.dll SAMain.vb

SAMain.exe正确打开的notepad.exe,等到我关闭它,并附带消息 “测试SAMain OK”

在SQLAnywhere中,我编码:

CREATE FUNCTION getDone() 
RETURNS LONG VARCHAR 
EXTERNAL NAME 'C:\data\CLR\SAExternal\SAExt.dll::SAExternal.getDone() string' 
LANGUAGE CLR 

调用FUNC通过“Select getDone()”返回一个错误: “无法加载文件或程序集'System,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = ........'或其中一个属性......”

如果我拿出SAExternal模块的过程的一部分:

Public Class SAExternal 
    Public Shared Function getDone() 
     getDone = "OK" 
    End Function 
End Class 

我的功能给了我正确的答案(‘OK’)

出于测试目的,我所有的阔叶树这些文件与我的数据库文件位于同一目录中,包括.vb和.dll。

我在网上搜索了几天,以了解我做错了什么,并且找不到我错过的东西。

有人能帮助我吗?

回答

0

尝试

CREATE FUNCTION getDone() RETURNS LONG VARCHAR 
EXTERNAL NAME 'C:\data\CLR\SAExternal\SAExt.dll::SAExternal.getDone() *out* string' 
LANGUAGE CLR 

请注意添加了选项的字符串

+0

的getDone执行前()函数返回一个语法错误接近*出*(或流出)*出*字符串。你确定这个语法在SQLAny 16中是正确的吗?它说:“不正确的参数列表中输入:* out * string not recognized” – karlD