2009-06-02 69 views
0


为什么ObjectDataSource的匹配算法不如......那么灵活?

即使UpdateNames存储过程只需要一个名为@First一个参数,我们仍然能够定义一个名为最后附加参数,并更新将仍然是成功的:

<asp:SqlDataSource ... UpdateCommand="UpdateNames" 
     UpdateCommandType="StoredProcedure"> 
     <UpdateParameters> 
      <asp:Parameter Name="First" Type="String" /> 
      <asp:Parameter Name="Last" Type="String" /> 
     </UpdateParameters> 
    </asp:SqlDataSource> 


但是在处理ObjectDataSource控件时,参数个数在ObjectDataSource中定义的rs必须与UpdateNames()方法中定义的参数数量完全匹配。因此,如果UpdateNames()只需命名首先,下面将导致异常

 <asp:ObjectDataSource ... UpdateMethod="UpdateNames"> 
     <UpdateParameters> 
      <asp:Parameter Name="First" Type="String" /> 
      <asp:Parameter Name="Last" Type="String" /> 
     </UpdateParameters> 
    </asp:ObjectDataSource> 


一个一个参数)为什么不ObjectDataSource的匹配算法灵活的SqlDataSource的匹配算法并因此忽略任何额外的参数?


谢谢

回答

2

ObjectDataSource控件交易1种灵活性另一个。

你是正确的,你的函数的参数完全符合列出的参数,但它是一个很好的理由。

ObjectDataSource可以让你定义多个函数来处理不同的参数,所以如果你想支持一个UpdateNames()方法,它可以使用名字或名字和姓氏,你可以定义两个函数并处理它们你觉得合适。

using System.ComponentModel; 

[DataObject] 
public class MyODS 
{ 
    [DataObjectMethod(DataObjectMethodType.Update)] 
    public void UpdateNames(string First) 
    { 
     UpdateNames(First, null) 
    } 

    [DataObjectMethod(DataObjectMethodType.Update)] 
    public void UpdateNames(string First, string Last) 
    { 
     //Do the update 
    } 
} 
+0

因此,如果ObjectDataSource与SqlDataSource具有相同的匹配算法,那么它可能不知道哪个重载方法要调用?! – SourceC 2009-06-02 22:08:57

1

一个完整的猜测,从两个经验:

的SQL版本只会经过数组的SQL脚本EXCUTE存储过程,追加的变量,因为它去。

ObjectDataSource使用反射来查找与传递的参数相匹配的更新方法。因此,如果在提供参数的对象上不存在匹配方法,则失败。

1

你可以把它看作如果你的SqlDataSource被“翻译”成SQL,这是完全合法的SQL:

DECLARE @First varchar(50) 
DECLARE @Last varchar(50) 
SELECT @First = 'some value', @Last = 'some other value' 

SELECT * FROM [MyTable] WHERE FirstName= @First 

在另一方面,你能想到一个ObjectDataSource的,如果它被翻译转换为使用反射功能(如PropertyInfo.GetValue()PropertyInfo.SetValue())的呼叫。如果您使用不存在的对象或字段调用其中一个,则会发生异常。