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 引擎之前对它做了什么?
谢谢,
罗布
检查您是否在使用嵌入式互操作类型。该功能对于脚本编写来说是有问题的,因为嵌入式类型会剥离您不在托管代码中使用的任何成员。
例如,如果您不在托管代码中使用 EOF
,EOF
属性 的元数据将被排除在 [=12= 的嵌入式版本之外].
在 Visual Studio 中,尝试将 ADODB 引用的 Embed Interop Types
属性 设置为 False
。
另一个尝试是将 executeQuery
return 类型更改为 object
,或添加属性 [ScriptMember(ScriptMemberFlags.ExposeRuntimeType)]
.
我正在使用 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 引擎之前对它做了什么?
谢谢,
罗布
检查您是否在使用嵌入式互操作类型。该功能对于脚本编写来说是有问题的,因为嵌入式类型会剥离您不在托管代码中使用的任何成员。
例如,如果您不在托管代码中使用 EOF
,EOF
属性 的元数据将被排除在 [=12= 的嵌入式版本之外].
在 Visual Studio 中,尝试将 ADODB 引用的 Embed Interop Types
属性 设置为 False
。
另一个尝试是将 executeQuery
return 类型更改为 object
,或添加属性 [ScriptMember(ScriptMemberFlags.ExposeRuntimeType)]
.