我使用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字段。
在将对象插入vbscript引擎之前,有人能帮助我解释clearscript对对象做了什么吗?
谢谢,
抢夺
发布于 2015-04-08 13:10:39
检查是否使用嵌入式互操作类型。这个特性对于脚本来说是有问题的,因为嵌入的类型被去掉了在托管代码中不使用的任何成员。
例如,如果在托管代码中不使用EOF,则EOF属性的元数据将被排除在Recordset的嵌入式版本之外。
在Visual中,尝试将ADODB引用的Embed Interop Types属性设置为False。
要尝试的另一件事是将executeQuery返回类型更改为object,或者添加属性[ScriptMember(ScriptMemberFlags.ExposeRuntimeType)]。
https://stackoverflow.com/questions/29503982
复制相似问题