2010-04-06 82 views
2

我试图在代码中打开names.nsf。这段代码已经工作了一段时间,但突然间,我变得空了。任何想法为什么?我似乎没有得到任何错误,我不知道如何解决什么是错的。为什么NotesSession.GetDatabase()可能返回null?

我可以从同一台机器上的Notes客户端打开数据库。

UPDATE

这是代码。这些字段在构造函数中初始化。空引用发生在.IsOpen()消息上。

public class DominoPersonSearcher 
{ 
    private string _serverName; 
    private string _databaseFileName; 
    private string _password; 
    private Domino.NotesDatabase OpenDatabase(out Domino.NotesSession notesSession) 
    { 
     notesSession = new Domino.NotesSessionClass(); 
     notesSession.Initialize(this._password); 

     Domino.NotesDatabase notesDatabase; 
     notesDatabase = notesSession.GetDatabase(this._serverName, this._databaseFileName, false); 

     if (!(notesDatabase.IsOpen)) 
     { 
      notesDatabase.Open(); 
     } 
     return notesDatabase; 
    } 

此代码是C#并运行在Web服务器上;它不在数据库内 - 它在Notes之外运行,只是调用它。我已经多次使用这个确切的机制。它使用围绕Lotus Domino对象COM C:\ notes \ domobj.tlb调用Interop.Domino.dll的.NET包装器。 Domino安装在不同的服务器上。

回答

6

从getdatabase返回null意味着您无法访问数据库。如果您将其作为Java代理运行,那么它将在您的权限下运行。可以将服务器配置为限制谁可以通过服务器上的代理访问数据库。

尝试在服务器上打开具有相同访问级别的另一个数据库或您有权访问的数据库。这样做,检查是否可以通过服务器上的代理打开数据库。如果你无法打开这个数据库,那么这听起来像是服务器的权限问题。这不是数据库本身,因为您可以通过Notes客户端访问它。

解决它的一个办法是,您还可以告诉代理在服务器的ID下运行。这通常会导致访问问题。代理的安全选项是“代理属性”对话框中的最后一个选项卡。请注意,此选项也可以通过服务器设置进行控制,如果您不允许这样做,则会收到错误消息。让我知道你如何去..

+0

这不是一个代理:我使用多米诺COM对象。我使用的是我登录时使用的相同ID - 我只提供密码,并使用最后登录的用户。事情是,它工作 - 我没有改变我的任何代码。好吧,无论如何,这不是。它只是导致它返回null的安全性吗? – ssg31415926 2010-04-06 18:58:25

+1

我现在需要知道你是如何构建你的代码的。代码从哪里运行?我假设它仍然在笔记数据库中被调用,就像表单或视图一样?应该可以解决问题。是的,这听起来像是迄今为止服务器的权限问题。 我仍然建议您在另一个数据库上运行相同的代码,以查看是否遇到同样的问题。只需将文件名(“names.nsf”)替换为同一台服务器上的另一个数据库文件即可。 names.nsf通常只对用户具有读者访问权限,因为它是Domino服务器上用户管理的主干。 – giulio 2010-04-07 04:02:58

+0

我看过代码。它看起来很好。那么,你有没有尝试用相同的代码在同一台服务器上打开另一个数据库? 我现在进入“调试模式”,通过使用print语句来检查我传递的参数的值,以确保它们是正确的。我没有做太多的COM,但它不应该是区分大小写的文件名。 – giulio 2010-04-07 22:02:06

1

我有同样的问题。我关闭了Lotus Mail并且应用程序正常工作。

notesSession.GetDatabase(this._serverName, this._databaseFileName, false); 

这里数据库已被莲花邮件服务器访问。这就是我们获取空值的原因。

这不是一个特权问题。