Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过远程处理的SqlConnection_C#_.net_Ado.net_Remoting - Fatal编程技术网

C# 通过远程处理的SqlConnection

C# 通过远程处理的SqlConnection,c#,.net,ado.net,remoting,C#,.net,Ado.net,Remoting,我开发了一个带有插件的wpf主机应用程序,并希望与SqlConnection共享它们,但当我试图通过远程处理传递SqlConnection的对象时,我遇到了一个错误: remoting cannot find field 'objectid' on type 'system.data.sqlclient.sqlconnection' Google和SO没有帮助我,我发现的唯一一个主题是链接断开:( 我可以通过某种方式传递SqlConnection吗?问题是我已经有了基于ado.net的应用程序

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

remoting cannot find field 'objectid' on type 'system.data.sqlclient.sqlconnection'
Google和SO没有帮助我,我发现的唯一一个主题是链接断开:(

我可以通过某种方式传递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

我将非常感谢来自异常调用堆栈的任何帮助,使用Reflector,我可以看到
SqlCommand.set\u Connection
正在尝试访问
SqlConnection.ObjectID
SqlConnection.ObjectID
标记为内部,只有公共成员可以通过远程处理访问

SqlConnection
是否使用池来最小化数据库连接的数量


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

我们最近遇到了相同的问题,我认为问题在于通过调用其构造函数在本地创建
SqlCommand
。然后将连接分配给它时,它会尝试o本地克隆连接,但由于某些内部属性无法通过远程处理而导致连接失败

对我们来说,解决这个问题的方法是在这样的连接上调用
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%正确,但对我来说这听起来有点合乎逻辑,而且在任何情况下它都为我们解决了问题。

你真的需要相同的连接还是只需要连接到同一个数据库?@DStanley是的,我需要相同的连接,因为我需要访问临时表。另外,任务是最小化到数据库的连接数据库(它加载我们的数据库太多)是的,你是对的,但问题是我的插件在不同的进程中运行,这就是我使用远程处理的原因。好吧,告诉我,SqlConnection继承了MarshalByRefObject。@AlexVoskresenskiy你是对的。你能从你的异常中添加完整的堆栈跟踪吗?很抱歉,回答晚了,我在问题Neil中添加了更多信息,我可以吗o有什么问题,或者我必须放弃?:)@AlexVoskresenskiy我对ADO.NET不太熟悉,所以我不知道是否有一种不用SqlCommand获取数据的方法?但你可能会在某个时候遇到类似的问题。也许最好是改变你的设计,也许是我在回答中建议的。好吧,很高兴听到,我的主题很有用。这种方法的主要问题是SQLConnection提供了比SQLCommand更多的可能性,即传递DataReader/DataWriter也将成为噩梦。但是,当然,如果您只能处理命令,那么解决方案看起来很棒。