Clearscript vbscript com ado interaction

时间:2015-04-08 00:46:06

标签: c# vbscript clearscript

我使用clearscript作为vbscript执行引擎。

我已经公开了以下C#对象(我很感激它并没有实际执行查询,我现在只是测试):

public class SCB
{
        public ADODB.Recordset executeQuery(string q)
        {
            ADODB.Recordset _recordset = new ADODB.Recordset();

            _recordset.Fields.Append("Id", ADODB.DataTypeEnum.adInteger);
            _recordset.Fields.Append("Name", ADODB.DataTypeEnum.adVarChar, 20);
            _recordset.Open(System.Reflection.Missing.Value
                    , System.Reflection.Missing.Value
                    , ADODB.CursorTypeEnum.adOpenStatic
                    , ADODB.LockTypeEnum.adLockOptimistic, 0);
            _recordset.AddNew(Type.Missing, Type.Missing);
            _recordset.Fields["Name"].Value = "Test";

            return _recordset;
        }
    }
}

我使用以下方法创建了一个vbscript主机:

_engine = new VBScriptEngine(WindowsScriptEngineFlags.EnableDebugging);

并将该类添加为此行的对象:

_engine.AddHostObject("SCB", HostItemFlags.GlobalMembers, new SCB());

如果我通过以下调用运行某些vbscript代码,则会收到错误(如下所述):

_engine.ExecuteCommand(code);

我正在执行的代码如下:

Function GetUniversalMessage
    dim lRS, sMessage, sColour,sTimeout
    Set Lrs = SCB. executeQuery ("SELECT MESSAGE, TIMEOUT, COLOUR, ENABLED FROM U_SCROLLER WHERE SCROLLER_ID=1 AND ENABLED='Y' AND (DISABLE_TIME IS NULL OR DISABLE_TIME>GETDATE())")
    if not lRS.EOF then
    End If
End Function

我收到一个异常,lrs.eof不是一个有效的字段......但是它对于一个ado com对象是有效的,如果我在返回脚本引擎之前检查在executeQuery中创建的对象,那么EOF字段是当下。 当我通过附加调试器并调用stop命令进行调试时,我可以看到vbscript中的lrs对象不包含EOF或大多数有效的Recordset字段。

有人可以帮我解释一下clearscript在插入vbscript引擎之前对该对象做了什么吗?

谢谢,

罗布

1 个答案:

答案 0 :(得分:0)

检查您是否使用嵌入式Interop类型。该功能对于脚本编写是有问题的,因为嵌入式类型被剥离了您在托管代码中不使用的任何成员。

例如,如果您未在托管代码中使用EOF,则EOF属性的元数据将不在Recordset的嵌入版本中。

在Visual Studio中,尝试将ADODB引用的Embed Interop Types属性设置为False

要尝试的另一件事是将executeQuery返回类型更改为object,或添加属性[ScriptMember(ScriptMemberFlags.ExposeRuntimeType)]