2011-11-22 68 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