Clearscript vbscript com ado 交互

Clearscript vbscript com ado interaction

我正在使用 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);

并使用此行将 class 添加为对象:

_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 中创建的对象 returns脚本引擎,存在 EOF 字段。 当我通过附加调试器并调用停止命令进行调试时,我可以看到 vbscript 中的 lrs 对象不包含 EOF,或者大部分有效的 Recordset 字段。

谁能帮我解释一下 clearscript 在将对象插入 vbscript 引擎之前对它做了什么?

谢谢,

罗布

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

例如,如果您不在托管代码中使用 EOFEOF 属性 的元数据将被排除在 [=12= 的嵌入式版本之外].

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

另一个尝试是将 executeQuery return 类型更改为 object,或添加属性 [ScriptMember(ScriptMemberFlags.ExposeRuntimeType)].