2009-06-02 71 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())的呼叫。如果您使用不存在的對象或字段調用其中一個,則會發生異常。