C#BI查询问题

2020-09-16 02:06发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好,

我正在尝试用C#编写一个函数,该函数将返回查询大小。

使用:

  • Visual Studio 2015社区版(ver 14.0.25431.01 Update 3)
  • Microsoft .NET Framework 4.6.01590

下面是一个简单的函数,该函数应返回处于"正在运行"状态且已运行一个小时以上的实例数。

使用的程序集:

  • BusinessObjects.Enterprise.Sdk-版本14.0.2000.0
  • BusinessObjects.Foundation.Logging-版本14.0.2000.0
使用BusinessObjects.Enterprise.Framework;
 使用BusinessObjects.Enterprise.Infostore

 静态无效checkBOv2()
 {
 字符串username =" Administrator";
 字符串密码="密码";
 字符串cmsname =" CMSNODE1:6400";
 字符串authType =" secEnterprise";
 现在的字符串= DateTime.Now.ToString(" yyyy.MM.dd.HH:mm:ss");
 然后字符串= DateTime.Now.AddHours(-1).ToString(" yyyy.MM.dd.HH:mm:ss");
 字符串查询="从CI_INFOOBJECTS,其中SI_INSTANCE = 1且SI_SCHEDULE_STATUS = 3且SI_STARTTIME BETWEEN'之间选择SI_PID,然后+"'AND'" +现在+"'";

 IEnterpriseSession ceSession = null;
 ceSession = CrystalEnterprise.GetSessionMgr()。Logon(用户名,密码,cmsname,authType);

 尝试
 {
 IInfoStore iStore =(IInfoStore)(ceSession.GetService(" InfoStore")));
 IInfoObjects queryResult = iStore.Query(query);
 int querySize = queryResult.ResultSize;
 Console.WriteLine(querySize);
 }
 捕获(异常e)
 {
 ceSession.Logoff();
 Console.WriteLine(e);
 }
 最后
 {
 如果(ceSession!= null)ceSession.Logoff();
 }
 } 

此刻我收到两个错误:

 log4net:ERROR XmlHierarchyConfigurator:
 无法创建类型为[BusinessObjects.Foundation.Logging.Log4net.RollingFileAppender,BusinessObjects.Foundation.Logging,版本= 12.0.0.0,文化=中性,PublicKeyToken = 692fbea5521e1304]的Appender [A1]。
 报告错误如下。
 System.IO.FileLoadException:无法加载文件或程序集" BusinessObjects.Foundation.Logging,版本= 12.0.0.0,Culture = neutral,PublicKeyToken = 692fbea5521e1304"或其依赖项之一。
 找到的程序集的清单定义与程序集引用不匹配。
 (来自HRESULT的异常:0x80131040)文件名:'BusinessObjects.Foundation.Logging,版本= 12.0.0.0,Culture = neutral,PublicKeyToken = 692fbea5521e1304'

设法通过将以下配置信息添加到App.config中来解决上述错误:

 
 
 
  

即使文件位于bin文件夹中,我也无法解决的第二个错误:

未处理的异常:System.TypeInitializationException:'BusinessObjects.Enterprise.Security.Internal._LogonEx3Proxy'的类型初始化程序引发了异常。  ---> System.IO.FileLoadException:库
 ld不会加载文件或程序集" BusinessObjects.Enterprise.Sdk.Ssl.netmodule"或其依赖项之一。 动态链接库(DLL)初始化例程失败。  (来自HRESULT的异常:0x8007045A)
    在System.RuntimeTypeHandle.GetTypeByName(字符串名称,布尔throwOnError,布尔ignoreCase,布尔反射Only,StackCrawlMarkHandle stackMark,IntPtr pPrivHostBinder,布尔loadTypeFromP
 artialName,ObjectHandleOnStack类型)
    在System.RuntimeTypeHandle.GetTypeByName(字符串名称,布尔throwOnError,布尔ignoreCase,布尔反射Only,StackCrawlMark&stackMark,IntPtr pPrivHostBinder,布尔loadTypeFromPartia
 lName)
    在System.RuntimeType.GetType处(字符串typeName,布尔throwOnError,布尔ignoreCase,布尔反射Only,StackCrawlMark和stackMark)
    在System.Type.GetType(String typeName)
    在BusinessObjects.Enterprise.Security.Internal._LogonEx3Proxy..cctor()
    ---内部异常堆栈跟踪的结尾---
    在BusinessObjects.Enterprise.Security.Internal._LogonEx3Proxy..ctor(IProxyHandler处理程序)处
    在BusinessObjects.Enterprise.Security.Internal.LogonService.ensureServiceStub()
    在BusinessObjects.Enterprise.Security.Internal.LogonService.userLogon处(字符串用户,字符串密码,字符串身份验证)
    在BusinessObjects.Enterprise.Security.Internal.SecurityMgr.userLogon处(字符串用户,字符串密码,字符串aps,字符串socksURI,字符串集群,字符串身份验证)
    在BusinessObjects.Enterprise.Framework.Internal.SessionMgr.Logon处(字符串用户,字符串密码,字符串cmsName,字符串身份验证)
 

我在tomcat Web应用程序中以.asp的形式工作,并且运行成功,但是使用了不同的库。 (我在C#中使用了错误的库?)

 <%@页面import =" com.crystaldecisions.sdk.framework.CrystalEnterprise"%>
 <%@页面import =" com.crystaldecisions.sdk.framework.IEnterpriseSession"%>
 <%@页面import =" com.crystaldecisions.sdk.occa.infostore.IInfoObject"%>
 <%@页面import =" com.crystaldecisions.sdk.occa.infostore.IInfoObjects"%>
 <%@页面import =" com.crystaldecisions.sdk.occa.infostore.IInfoStore"%>
 <%@页面import =" com.crystaldecisions.enterprise.ocaframework。*"%> 

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好,

我正在尝试用C#编写一个函数,该函数将返回查询大小。

使用:

  • Visual Studio 2015社区版(ver 14.0.25431.01 Update 3)
  • Microsoft .NET Framework 4.6.01590

下面是一个简单的函数,该函数应返回处于"正在运行"状态且已运行一个小时以上的实例数。

使用的程序集:

  • BusinessObjects.Enterprise.Sdk-版本14.0.2000.0
  • BusinessObjects.Foundation.Logging-版本14.0.2000.0
使用BusinessObjects.Enterprise.Framework;
 使用BusinessObjects.Enterprise.Infostore

 静态无效checkBOv2()
 {
 字符串username =" Administrator";
 字符串密码="密码";
 字符串cmsname =" CMSNODE1:6400";
 字符串authType =" secEnterprise";
 现在的字符串= DateTime.Now.ToString(" yyyy.MM.dd.HH:mm:ss");
 然后字符串= DateTime.Now.AddHours(-1).ToString(" yyyy.MM.dd.HH:mm:ss");
 字符串查询="从CI_INFOOBJECTS,其中SI_INSTANCE = 1且SI_SCHEDULE_STATUS = 3且SI_STARTTIME BETWEEN'之间选择SI_PID,然后+"'AND'" +现在+"'";

 IEnterpriseSession ceSession = null;
 ceSession = CrystalEnterprise.GetSessionMgr()。Logon(用户名,密码,cmsname,authType);

 尝试
 {
 IInfoStore iStore =(IInfoStore)(ceSession.GetService(" InfoStore")));
 IInfoObjects queryResult = iStore.Query(query);
 int querySize = queryResult.ResultSize;
 Console.WriteLine(querySize);
 }
 捕获(异常e)
 {
 ceSession.Logoff();
 Console.WriteLine(e);
 }
 最后
 {
 如果(ceSession!= null)ceSession.Logoff();
 }
 } 

此刻我收到两个错误:

 log4net:ERROR XmlHierarchyConfigurator:
 无法创建类型为[BusinessObjects.Foundation.Logging.Log4net.RollingFileAppender,BusinessObjects.Foundation.Logging,版本= 12.0.0.0,文化=中性,PublicKeyToken = 692fbea5521e1304]的Appender [A1]。
 报告错误如下。
 System.IO.FileLoadException:无法加载文件或程序集" BusinessObjects.Foundation.Logging,版本= 12.0.0.0,Culture = neutral,PublicKeyToken = 692fbea5521e1304"或其依赖项之一。
 找到的程序集的清单定义与程序集引用不匹配。
 (来自HRESULT的异常:0x80131040)文件名:'BusinessObjects.Foundation.Logging,版本= 12.0.0.0,Culture = neutral,PublicKeyToken = 692fbea5521e1304'

设法通过将以下配置信息添加到App.config中来解决上述错误:

 
 
 
  

即使文件位于bin文件夹中,我也无法解决的第二个错误:

未处理的异常:System.TypeInitializationException:'BusinessObjects.Enterprise.Security.Internal._LogonEx3Proxy'的类型初始化程序引发了异常。  ---> System.IO.FileLoadException:库
 ld不会加载文件或程序集" BusinessObjects.Enterprise.Sdk.Ssl.netmodule"或其依赖项之一。 动态链接库(DLL)初始化例程失败。  (来自HRESULT的异常:0x8007045A)
    在System.RuntimeTypeHandle.GetTypeByName(字符串名称,布尔throwOnError,布尔ignoreCase,布尔反射Only,StackCrawlMarkHandle stackMark,IntPtr pPrivHostBinder,布尔loadTypeFromP
 artialName,ObjectHandleOnStack类型)
    在System.RuntimeTypeHandle.GetTypeByName(字符串名称,布尔throwOnError,布尔ignoreCase,布尔反射Only,StackCrawlMark&stackMark,IntPtr pPrivHostBinder,布尔loadTypeFromPartia
 lName)
    在System.RuntimeType.GetType处(字符串typeName,布尔throwOnError,布尔ignoreCase,布尔反射Only,StackCrawlMark和stackMark)
    在System.Type.GetType(String typeName)
    在BusinessObjects.Enterprise.Security.Internal._LogonEx3Proxy..cctor()
    ---内部异常堆栈跟踪的结尾---
    在BusinessObjects.Enterprise.Security.Internal._LogonEx3Proxy..ctor(IProxyHandler处理程序)处
    在BusinessObjects.Enterprise.Security.Internal.LogonService.ensureServiceStub()
    在BusinessObjects.Enterprise.Security.Internal.LogonService.userLogon处(字符串用户,字符串密码,字符串身份验证)
    在BusinessObjects.Enterprise.Security.Internal.SecurityMgr.userLogon处(字符串用户,字符串密码,字符串aps,字符串socksURI,字符串集群,字符串身份验证)
    在BusinessObjects.Enterprise.Framework.Internal.SessionMgr.Logon处(字符串用户,字符串密码,字符串cmsName,字符串身份验证)
 

我在tomcat Web应用程序中以.asp的形式工作,并且运行成功,但是使用了不同的库。 (我在C#中使用了错误的库?)

 <%@页面import =" com.crystaldecisions.sdk.framework.CrystalEnterprise"%>
 <%@页面import =" com.crystaldecisions.sdk.framework.IEnterpriseSession"%>
 <%@页面import =" com.crystaldecisions.sdk.occa.infostore.IInfoObject"%>
 <%@页面import =" com.crystaldecisions.sdk.occa.infostore.IInfoObjects"%>
 <%@页面import =" com.crystaldecisions.sdk.occa.infostore.IInfoStore"%>
 <%@页面import =" com.crystaldecisions.enterprise.ocaframework。*"%> 

付费偷看设置
发送
4条回答
shere_lin
1楼 · 2020-09-16 02:37.采纳回答

我明白了问题所在-您需要在您的应用程序中引用CrystalDecisions.Enterprise.Framework和CrystalDecisions.Enterprise.InfoStore。 然后,在您的代码中,您只需要"使用CrystalDecisions.Enterprise;"即可。 以便能够与他们两个一起工作。

将它们添加到项目的"引用"部分时,请确保进入每个属性并将"嵌入互操作类型"设置为false。

就最佳做法而言,我将您的代码重写为此:

使用CrystalDecisions.Enterprise;

 静态无效checkBOv2()
 {
   字符串username =" Administrator";
   字符串密码="密码";
   字符串cmsname =" CMSNODE1:6400";
   字符串authType =" secEnterprise";
   现在的字符串= DateTime.Now.ToString(" yyyy.MM.dd.HH:mm:ss");
   然后字符串= DateTime.Now.AddHours(-1).ToString(" yyyy.MM.dd.HH:mm:ss");
   字符串查询="从CI_INFOOBJECTS中选择SI_PID,其中SI_INSTANCE = 1且SI_SCHEDULE_STATUS = 3且SI_STARTTIME BETWEEN'" +然后+"'AND'" +现在+"'";

   IEnterpriseSession ceSession = null;
   尝试
   {
     ceSession = CrystalEnterprise.GetSessionMgr()。Logon(用户名,密码,cmsname,authType);
     IInfoStore iStore =(IInfoStore)(ceSession.GetService(" InfoStore")));
     使用(IInfoObjects queryResult = iStore.Query(query)){
       int querySize = queryResult.ResultSize;
       Console.WriteLine(querySize);
     } 
} 捕获(异常e) { Console.WriteLine(e); } 最后 { 如果(iStore!= null)iStore.Dispose(); 如果(ceSession!= null){ 尝试 { ceSession.Logoff(); ceSession.Dispose(); } 抓住 { //吃掉错误 这是为了防止调试时出错。 在一个 //"正常"运行,这些错误将被忽略。 } } } }

.NET SDK的大部分基于COM对象,.NET不一定能很好地管理内存。 最佳做法是执行以下两项操作之一:

1。 在"使用"子句中创建对象,以便在超出范围时进行编程以自动对它们调用.Dispose()。

2。 完成后,在对象上显式调用.Dispose()。

我在上面的代码中同时使用了这两种技术。

-Dell

灬番茄
2楼-- · 2020-09-16 02:21

此外,安全性库均已使用4.2 SP4更新。 过去,您可以使用与服务器上的平台版本不同的SDK版本进行连接(不建议这样做,但是可以这样做...)。但是,如果您使用的是4.2 SP4或更高版本, 具有相同版本的SDK以便登录到CMS服务器。

-戴尔

Baoming ROSE
3楼-- · 2020-09-16 02:42

你好,

感谢您对此问题的反馈。

仅更改CrystalDecisions.Enterprise.Framework和CrystalDecisions.Enterprise.InfoStore引用不能解决该问题。

我在这里找到了一些例子:

 https://archive.sap.com/documents/docs/DOC-50603#jive_content_id_C#_Managed_BOE_/_BI_sample_applications

 http://www.sdn.sap.com/irj/scn/index?rid=/library/uuid/e0cde7b2-05e2-2e10-cab0-86ee7ca46e62 

如果要执行此工作,则必须根据上面的示例更新代码:

使用CrystalDecisions.Enterprise;

 ....

 字符串username =" Administrator";
 字符串密码="密码";
 字符串cmsname =" CMSNODE1:6400";
 字符串authType =" secEnterprise";
 现在的字符串= DateTime.Now.ToString(" yyyy.MM.dd.HH:mm:ss");
 然后字符串= DateTime.Now.AddHours(-1).ToString(" yyyy.MM.dd.HH:mm:ss");
 字符串查询="从CI_INFOOBJECTS,其中SI_INSTANCE = 1且SI_SCHEDULE_STATUS = 3且SI_STARTTIME BETWEEN'之间选择SI_PID,然后+"'AND'" +现在+"'";

 EnterpriseSession boEnterpriseSession = null;
 EnterpriseService boEnterpriseService;
 SessionMgr boSessionMgr = null;
 InfoStore boInfoStore = null;
 InfoObjects boInfoObjects = null;

 boSessionMgr =新的CrystalDecisions.Enterprise.SessionMgr();
 boEnterpriseSession = boSessionMgr.Logon(用户名,密码,cmsName,身份验证);
 尝试
 {
 boEnterpriseService = boEnterpriseSession.GetService(""," InfoStore");
 boInfoStore =新的InfoStore(boEnterpriseService);
 boInfoObjects = boInfoStore.Query(queryString);
 int querySize = boInfoObjects.ResultCount;
 Console.WriteLine(querySize);
 }
 ... 

但出现以下错误:

 System.Runtime.InteropServices.COMException(0x80045701):内部错误。
    在CrystalDecisions.Enterprise.Internal.SessionMgrClass.Logon处(字符串用户名,字符串密码,字符串CMSName,字符串身份验证)
    在CrystalDecisions.Enterprise.SessionMgr.Logon处(字符串userName,字符串密码,字符串cMSName,字符串身份验证)

 
  • 当我使用Crystal Enterprise的32个库时,这被编译为32位
  • 在所有Crystal参考上,
  • 嵌入式互操作类型都设置为false

将我的本地程序集dll与服务器进行了比较,它们是相同的版本(唯一的区别是服务器在64位上运行)

有什么想法吗?

亦是此间程序员
4楼-- · 2020-09-16 02:40

我已经删除了所有已安装并保留在BI Client库中的SDK。

该应用现在可以使用32位版本运行。

一周热门 更多>