2010-04-06 197 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); 

這裏數據庫已被蓮花郵件服務器訪問。這就是我們獲取空值的原因。

這不是一個特權問題。