首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >远程SqlConnection

远程SqlConnection
EN

Stack Overflow用户
提问于 2014-04-03 15:31:32
回答 2查看 598关注 0票数 1

我开发了一个带有插件的wpf主机应用程序,并希望共享SqlConnection,但是当我试图通过远程处理传递SqlConnection对象时,我会得到一个错误:

代码语言:javascript
复制
remoting cannot find field 'objectid' on type 'system.data.sqlclient.sqlconnection'

谷歌等人帮不了我,我找到的唯一的话题就是链接断裂:

我能通过SqlConnection吗?问题是,我已经有了基于ADO.NET的应用程序,并且没有重写它们的可能性。另一方面,我需要提供对同一连接的不同插件访问,因为它们可以通过临时表进行互操作。

例外信息:

代码语言:javascript
复制
(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

我很感激你的帮助

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-03 16:00:30

从异常调用堆栈并使用Reflector,我可以看到SqlCommand.set_Connection正在尝试访问SqlConnection.ObjectIDSqlConnection.ObjectID被标记为内部成员,只有公共成员可以通过远程处理获得。

SqlConnection不是使用池来最小化数据库连接的数量吗?Server连接池

您是否可以有一个与数据库对话的进程,然后所有其他进程都将通过传递查询字符串从数据库中请求数据?

票数 2
EN

Stack Overflow用户

发布于 2014-05-15 22:35:59

我们最近遇到了同样的问题,我认为问题是通过调用SqlCommand的构造函数在本地创建它。然后,当将连接分配给它时,它也尝试在本地复制连接,这也是由于一些内部属性(通过远程处理无法使用)而失败的。

对我们来说,解决办法是在连接上调用CreateCommand(),如下所示

代码语言:javascript
复制
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%正确,但这听起来有点合乎逻辑,而且无论如何,它为我们解决了这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22842327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档