在DFC中,可以使用该IDfSession.apiExec()方法直接执行SQL(绕过DQL).问题是该方法在DFC API的当前(6.x,7.x)版本中被标记为已弃用.
以下是使用弃用方法的一些示例代码:
IDfSession session;
(...)
String sql = "UPDATE dm_sysobject_s SET r_modifier = 'hacker' WHERE r_object_id = '<some_id>'";
session.apiExec("execsql", sql);
Run Code Online (Sandbox Code Playgroud)
这工作正常,但已经提到过apiExec不推荐使用.
我也尝试了另一种方法:
(...)
IDfQuery query = new DfQuery(sql);
query.execute(session, IDfQuery.DF_EXEC_QUERY);
Run Code Online (Sandbox Code Playgroud)
据我所知,这应该有效,但我不断收到以下信息:
[DM_QUERY_E_REG_TABLE_PERMIT_IN]error: "You have insufficient privilege to UPDATE the dbo.dm_sysobject_s table."
Run Code Online (Sandbox Code Playgroud)
我在使用时收到相同的错误消息IDfQuery.DF_QUERY,但无论如何DF_EXEC_QUERY是应该工作的那个 - 或者?我当然是用超级用户帐户来尝试这个,所以我不知道我缺少哪些权限.
是否有一种好的,不推荐的方式从DFC中执行原始SQL语句?
我还想补充一点,我是非常清楚的原始SQL是强烈反对,因为它绕过的Documentum的安全模型.我也知道我可以@SuppressWarnings("deprecation")在我的Java代码中使用,但这并没有使该方法不再被弃用.
我正在使用Eclipse 4.3 Kepler(实际上是STS 3.6.1).
我碰到了一些代码:
private String someMethod(String myParam) {
try {
MyInterface myVar = (MyInterface) domeSomething(myParam);
if (myVar != null) {
return myVar.methodThatReturnsString();
}
} catch (Exception e) {
return "";
}
return ""; // eclipse marks this as dead code
}
Run Code Online (Sandbox Code Playgroud)
(正如您所期望的那样,该doSomething()方法会抛出一些异常,并返回一个比一般更通用的接口MyInterface.)
Eclipse将最后一个return语句强调为死代码,如果我将其删除为quickfix建议,我将使用"此方法应返回String类型的结果"错误.
为什么最后一个return语句是死代码?是因为班级演员吗?假设doSomething()可以返回null,如果你施放它,会抛出一个类强制转换异常吗?
而且,为什么Eclipse建议我用导致死代码警告的错误修复错误?是因为Eclipse无法预测这个吗?