我开发了一个带有插件的wpf主机应用程序,并希望共享SqlConnection,但是当我试图通过远程处理传递SqlConnection对象时,我会得到一个错误:
remoting cannot find field 'objectid' on type 'system.data.sqlclient.sqlconnection'谷歌等人帮不了我,我找到的唯一的话题就是链接断裂:
我能通过SqlConnection吗?问题是,我已经有了基于ADO.NET的应用程序,并且没有重写它们的可能性。另一方面,我需要提供对同一连接的不同插件访问,因为它们可以通过临时表进行互操作。
例外信息:
(last error: Remoting cannot find field 'ObjectID' on type 'System.Data.SqlClient.SqlConnection'.).
StackTrace:
Server stack trace:
at System.Object.GetFieldInfo(String typeName, String fieldName)
at System.Object.FieldGetter(String typeName, String fieldName, Object& val)
at System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Object[]& outArgs)
at System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at System.Object.FieldGetter(String typeName, String fieldName, Object& val)
at System.Data.SqlClient.SqlCommand.set_Connection(SqlConnection value)
at LSSample.SampleUserControl.ExecuteSqlLocal() in c:\Users\voskresenskiy\Documents\Visual Studio 2013\Projects\UIContainer\WpfHost\LSSample\SampleUserControl.xaml.cs:line我很感激你的帮助
发布于 2014-04-03 16:00:30
从异常调用堆栈并使用Reflector,我可以看到SqlCommand.set_Connection正在尝试访问SqlConnection.ObjectID。SqlConnection.ObjectID被标记为内部成员,只有公共成员可以通过远程处理获得。
SqlConnection不是使用池来最小化数据库连接的数量吗?Server连接池
您是否可以有一个与数据库对话的进程,然后所有其他进程都将通过传递查询字符串从数据库中请求数据?
发布于 2014-05-15 22:35:59
我们最近遇到了同样的问题,我认为问题是通过调用SqlCommand的构造函数在本地创建它。然后,当将连接分配给它时,它也尝试在本地复制连接,这也是由于一些内部属性(通过远程处理无法使用)而失败的。
对我们来说,解决办法是在连接上调用CreateCommand(),如下所示
void MethodRunningInAppDomainB(SqlConnection connectionFromAppDomainA, SqlTransaction transactionFromAppDomainA)
{
using (var cmd = connectionFromAppDomainA.CreateCommand())
{
cmd.CommandText = "this is my query";
cmd.Transaction = transaction;
cmd.Parameters.Add(...);
...
cmd.ExecuteNonQuery();
}
}基本上,连接和事务来自主应用程序,该应用程序被传递给运行在不同AppDomain中的插件(因此可以卸载),该插件可以在主查询的上下文中执行一些自定义命令。
我的怀疑是,调用连接上的CreateCommand()会远程回叫,并在连接所在的同一个应用域中创建命令,而您返回的创建的命令可能就是该调用的代理,这就是为什么这种方法有效。
不确定我对这个问题的解释是否100%正确,但这听起来有点合乎逻辑,而且无论如何,它为我们解决了这个问题。
https://stackoverflow.com/questions/22842327
复制相似问题