none
为什么一个是继承自DataContext,一个是传递该类型的参数,两个实例的拥有的方法却不一样呢 RRS feed

  • 问题

  • 在使用Linq调用存储过程时,在继承自DataContext的类中总是需要调用这个方法this.ExecuteMethodCall();
    这个方法的第一个参数通常使用this,指向DataContext实例。
    但是我在一个没有继承自DataContext的类中定义一个方法,该方法同调用存储过程的方法完全相同,并且多加了一个DataContext类型的输入参数,我想在我使用这个方法的时候给它传入一个DataContext的实例,可是在这个方法中,我把this改成我的参数名却不能通过编译,看了看,发现DataContext的这个实例却没有上面的方法。
    难道调用存储过程只能通过继承DataContext的类来实现吗?
    还有,为什么一个是继承自DataContext,一个是传递该类型的参数,两个实例的拥有的方法却不一样呢?这在语法上应该怎么解释?


    做最好的自己
    2009年7月15日 6:50

答案

  • 请查阅msdn可以看到ExecuteMethodCall是保护方法,故只有在继承DataContext的类中才能使用。具体定义如下:
    protected internal IExecuteResult ExecuteMethodCall(
    	Object instance,
    	MethodInfo methodInfo,
    	Object[] parameters
    )
    另,您的另一个问题我也回复了,请见:http://social.microsoft.com/Forums/zh-CN/adonetzhchs/thread/16f55f43-f790-4f51-a1e1-3f7d46bf2800
    其中因您重新定义了一个泛型的方法,而用反射来调用时需要转一下,通过MethodInfo的MakeGenericMethod 来完成。关于MethodInfo的MakeGenericMethod 的介绍我也贴出了相关的连接,如果该问题您觉得没解决,请继续,如果已解决请结束。麻烦您别置之不理。谢谢!
    2009年7月18日 4:15

全部回复

  • 我没用Linq调存储过程,不过我喜欢分析这类问题,您如果可以将上速的文字转成关键的代码,并在适当处标记上疑惑的地方。我想会看的更清楚一些。
    虽然没用过,但可以从语法的角度分析一下。
    另您提到“难道调用存储过程只能通过继承DataContext的类来实现吗?”
    如果一定是这样说明这是.net提供的框架约定。
    2009年7月15日 7:29
  • 有些扩展方法   static method(this Type,args)
    必须要using 他所在的命名空间才能作用在目标类型上

    请检查这两个cs 前面的using 是否相同  把缺少的补上试验下

    答案900, 目标五颗星 Aurvana Air, 音乐真的是随风飘来的 凉宫春日 永无止境的八月 你到底什么时候结束阿。。。。
    2009年7月15日 9:25
  • 两个类的using完全一样,且在同一个项目里,所以引用也是一样的。


    做最好的自己
    2009年7月18日 3:27
  • 我把我的示例的代码发上来,大家帮忙看看。

    下面的代码为继承DataContext的类,这个类没有问题,一切正常:

    using System.Data.Linq;
    using System.Data.Linq.Mapping;
    using System.Reflection;

    namespace WebApplication4
    {
        public class MyContext:System.Data.Linq.DataContext
        {
            public MyContext()
                : base("Data Source=.;Initial Catalog=Northwind;User ID=sa;Password=123")
            {
            }

            /// <summary>
            /// 存储过程有输入参数,有输出参数,不返回数据集
            /// </summary>
            /// <param name="customerID"></param>
            /// <param name="totalSales"></param>
            /// <returns></returns>
            [Function(Name = "[dbo].[CustOrderTotal]")]
            public int CustOrderTotal(
                [Parameter(Name = "@CustomerID", DbType = "NChar(5)")] string customerID,
                [Parameter(Name = "@TotalSales", DbType = "Money")] ref System.Nullable<decimal> totalSales)
            {
                IExecuteResult result = this.ExecuteMethodCall(
                    this,
                    ((MethodInfo)(MethodInfo.GetCurrentMethod())),
                    customerID,
                    totalSales);
                totalSales = ((decimal?)(result.GetParameterValue(1)));
                return ((int)(result.ReturnValue));
            }
        }
    }


    下面的代码是在一个页面下的CS文件中的代码,这个类没有继承DataContext:

            /// <summary>
            /// 存储过程有输入参数,有输出参数,不返回数据集
            /// </summary>
            /// <param name="customerID"></param>
            /// <param name="totalSales"></param>
            /// <returns></returns>
            [Function(Name = "[dbo].[CustOrderTotal]")]
            public int CustOrderTotal(
                [Parameter(Name = "@CustomerID", DbType = "NChar(5)")] string customerID,
                [Parameter(Name = "@TotalSales", DbType = "Money")] ref System.Nullable<decimal> totalSales,
                DataContext context)
            {
                IExecuteResult result = context.ExecuteMethodCall(
                    context,
                    ((MethodInfo)(MethodInfo.GetCurrentMethod())),
                    customerID,
                    totalSales);
                totalSales = ((decimal?)(result.GetParameterValue(1)));
                return ((int)(result.ReturnValue));
            }
    在上面的代码中,context是没有ExecuteMethodCall()方法的,我点了,点不出来。编译器也提示没有。

     


    做最好的自己
    2009年7月18日 3:27
  • 请查阅msdn可以看到ExecuteMethodCall是保护方法,故只有在继承DataContext的类中才能使用。具体定义如下:
    protected internal IExecuteResult ExecuteMethodCall(
    	Object instance,
    	MethodInfo methodInfo,
    	Object[] parameters
    )
    另,您的另一个问题我也回复了,请见:http://social.microsoft.com/Forums/zh-CN/adonetzhchs/thread/16f55f43-f790-4f51-a1e1-3f7d46bf2800
    其中因您重新定义了一个泛型的方法,而用反射来调用时需要转一下,通过MethodInfo的MakeGenericMethod 来完成。关于MethodInfo的MakeGenericMethod 的介绍我也贴出了相关的连接,如果该问题您觉得没解决,请继续,如果已解决请结束。麻烦您别置之不理。谢谢!
    2009年7月18日 4:15
  • 呵呵,谢谢。
    做最好的自己
    2009年7月19日 1:56