0

我使用 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 返回脚本引擎之前检查在 executeQuery 中创建的对象,则存在 EOF 字段。当我通过附加调试器并调用停止命令进行调试时,我可以看到 vbscript 中的 lrs 对象不包含 EOF 或大多数有效的 Recordset 字段。

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

谢谢,

4

1 回答 1

0

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

例如,如果您不在EOF托管代码中使用,则该EOF属性的元数据将被排除在Recordset.

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

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

于 2015-04-08T13:10:39.737 回答