使用COM API从Notes检索数据

时间:2013-12-09 16:05:42

标签: c# odbc lotus-notes

我正在尝试使用NotesSQL ODBC驱动程序和COM API从Lotus Notes数据库打开一个视图。当我使用Access来“链接到外部数据”时,会列出使用notesSQL超过380个“表”。

使用COM API编写以下C#代码以列出视图:仅返回230个对象。看来包含数据的实际表将从“视图”列表中排除。

var _someDatabase = _lotesNotesSession.GetDatabase("MainServer/Server/Company/US", @"Groups\Location\someNotesDatabase", false);

        var _views = _someDatabase.Views;
        foreach (var view in _views)
            Console.WriteLine(view.Name);

连接到实际包含数据的表的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

根据您的评论进行修改。

好的......所以你没有使用NotesSQL。您正在使用Notes COM API。如果要获取Notes数据库中所有视图的列表,请使用_someDatabase.Views属性,就像您所做的那样。但是要从Notes数据库中读取数据,您需要读取包含NotesItem对象的NotesDocument对象。

有许多方法可以读取NotesDocument对象。如,

  • 使用NotesDatabase.AllDocuments属性为您提供包含所有NotesDocuments的NotesDocumentCollection对象
  • 使用NotesDatabase.Search方法,该方法为您提供仅包含符合搜索条件的NotesDocument对象的NotesDocumentCollection对象。
  • 循环访问与特定视图关联的NotesDocuments集合。

我将简要介绍最后一个选项,因为它将强调我想要做的一点。

视图包含我们称之为集合的NotesDocument对象。文件夹也是如此。您从_someDatabase.Views的调用中获得了视图(作为一组NotesView对象),因此对于任何这些视图,您都可以执行以下操作:

thisDoc = view.GetFirstDocument
while (thisDoc != null)
{
    processNotesDocument(thisDoc)
    thisDoc = view.GetNextDocument
} 

然后你可以编写一个processNotesDocument函数,该函数使用Notes COM API调用从NotesDocument中读取数据(即NotesItem对象)。您可以查看NotesDocument类的文档以了解如何执行此操作。

问题是,在你可以去做之前,你必须回答这个问题:我想要做哪个观点(或观点)?或者您必须选择我上面列出的其他方法之一来访问NotesDocument对象。

我不是故意不尊重,但我认为您需要先了解一下您正在处理的数据以及Lotus Notes数据库设计,然后才能解决那。我推断,你的问题并不表明你甚至知道Lotus Notes中的基本信息单元被称为"文档",并且Notes编程有一个很大的问题。 API并不是一个人通常可以导航的东西,而不知道你首先要去哪里。

这里有一个link,它将带您进入NotesDocument类的参考信息。它还应该为API中所有其他类的文档提供导航。但我认为你真正需要的是一个关于Lotus Notes编程基本概念的教程,不幸的是所有好东西都是陈旧的而不是面向C#。好消息是,C#中的类和概念几乎相同,因为它们是Notes原生的LotusScript语言,与Java API中的类和概念没有太大区别 - - 甚至相当陈旧的东西仍然会对你需要的基础知识有所帮助。这是另一个StackOverflow问题的link,可以帮助您指出一些可以帮助您的材料。

=============================================== ==================================

从这一点开始的原始答案......

第一:C#代码是否在与Access相同的Notes ID下运行?如果没有,那么Notes数据库设计中的安全限制可能会导致不同的结果。或者至少部分负责。 第二:我认为你知道这一点(因为你使用了表'表'),但没有表格。 NotesSQL驱动程序只使它看起来像表,并且它同时使用视图和表单。具有160个表单的Notes数据库有点不寻常,但并非完全闻所未闻。那可能就是你所看到的。但请记住,针对Views的NotesSQL查询比针对Forms的查询更有效,因为前者违背了预先构建在服务器上的索引,而后者必须搜索整个数据库。如果您需要查询未包含在任何现有View中的字段,那么您当然可以对表单使用查询。您可以通过_localDatabase.Forms获取表单列表。但更好的方法是使用Domino Designer添加所需的视图,然后针对视图执行NotesSQL查询。 第三:但是我对你编写上述代码的原因感到有点困惑,因为它没有使用NotesSQL。它使用Notes COM API(可能是通过互操作DLL),因为这是C#。但既然你正在这样做,那么为什么要烦扰NotesSQL呢?您已经在使用更适合在Notes / Domino数据上执行操作的API,并且很可能为您提供一种比NotesSQL更高效地获取数据的方法 - 无需添加任何新视图数据库,虽然这可能取决于您对现有视图,数据关系等的理解。 最后:与您的实际问题无关,但只是一些友好的建议:您应该真正更改变量_localDatabase的名称。拥有Notes / Domino经验的任何人都可能会解释" local"引用一个不经过Domino服务器访问的数据库 - 这是我最初的想法。但仔细查看代码,我发现您实际上是在名为MainServer / Server / Company / US的服务器上打开数据库。