2011-11-22 66 views
0

我已經建立了一個db4o服務器和客戶端。我的客戶呼叫不起作用。客戶端如何查詢db4o服務器?

令我感到困惑的是,db4o示例顯示了客戶端如何關閉服務器,但不知道如何獲取和保存數據。請參閱:http://community.versant.com/Documentation/Reference/db4o-7.12/java/reference/Content/client-server/networked/simple_db4o_server.htm

如果我啓動db4o服務器並運行netstat,則可以看到端口已打開。在客戶端上,我可以這樣做:

Debug.WriteLine(db.Ext()。IsClosed()。ToString());

並且返回False,這很好。

但是,當我嘗試獲取或保存數據時,它不起作用。在保存數據時,它似乎可行,但我在數據庫中看不到數據。試圖檢索該對象時,出現此錯誤:

Db4objects.Db4o.Ext.Db4oException:拋出了類型爲'Db4objects.Db4o.Ext.Db4oException'的異常。 ---> System.ArgumentException:類型'Db4objects.Db4o.Internal.Query.DelegateEnvelope'上定義的字段'_delegateType'不是類型爲'Db4objects.Db4o.Reflect.Generic.GenericObject'的目標對象上的字段。

下面是客戶端調用保存,然後得到:

Server server = new Server() { Name = "AppServerFoo" }; 
IObjectContainer db = GetDatabase(); 
db.Store(server); 
db.Close(); 

這裏是在GetDatabase唯一的線()方法:

return Db4oClientServer.OpenClient(Db4oClientServer.NewClientConfiguration(), "DellXps", 8484, "user", "password"); 

而這裏的呼叫從DB獲得:

IObjectContainer db = GetDatabase(); 
Server testServer = db.Query<Server>(server => server.Name == "AppServerFoo").FirstOrDefault(); 
db.Close(); 

我錯過了什麼?

回答

2

那麼服務器沒有參考的持久類是一個「危險的'的東西。許多功能不起作用,發生的錯誤是神祕的。我強烈建議始終使用服務器上的持久類引用程序集。

另一個提示:使用LINQ instead原生查詢。它效果更好,問題更少。

+0

這個方法對我來說有兩個小問題。我是一個純粹主義者,我認爲不得不在數據庫服務器上部署我的程序集。也許這是因爲我不習慣於MS SQL Server。或者,也許是因爲我正在考慮進行部署。另外,我不想改變我的編碼風格(lambda優先於linq),因爲選擇了持久性存儲。說了這麼多,OODB對我來說是新的,所以我現在只需用DB部署這些實體,並隨着時間的推移找到我自己的方式。謝謝! –

0

阿哈!我知道了。它採取了一些谷歌搜索,但問題是,服務器沒有參考實體。只要我的服務器項目引用了我的客戶端項目,它就起作用了。所以,看起來我只需要將我的實體移動到客戶端和服務器都可以引用的通用項目。

由於此鏈接: http://www.gamlor.info/wordpress/2009/11/db4o-client-server-and-concurrency/

這個鏈接看起來像一個門戶,使服務器工作不引用實體: http://community.versant.com/Documentation/Reference/db4o-7.12/net2/reference/html/reference/client-server/server_without_persistent_classes_deployed.html