我使用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引擎之前对该对象做了什么吗?
谢谢,
罗布
答案 0 :(得分:0)
检查您是否使用嵌入式Interop类型。该功能对于脚本编写是有问题的,因为嵌入式类型被剥离了您在托管代码中不使用的任何成员。
例如,如果您未在托管代码中使用EOF
,则EOF
属性的元数据将不在Recordset
的嵌入版本中。
在Visual Studio中,尝试将ADODB引用的Embed Interop Types
属性设置为False
。
要尝试的另一件事是将executeQuery
返回类型更改为object
,或添加属性[ScriptMember(ScriptMemberFlags.ExposeRuntimeType)]
。