2009-06-02 10 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()メソッドで定義されたパラメータの数と完全に一致している必要があります。がまずという名前のパラメータを1つだけ取ります)(UpdateNamesしたがって、もし、以下は例外

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


A)なぜのObjectDataSourceのマッチングアルゴリズムは、SqlDataSourceコントロールのマッチングアルゴリズムとして柔軟性としてはないが発生します余分なパラメータは無視されますか?


答えて

2

ありがとうObjectDataSourceのは、別のための柔軟性の一種の売買を行っています。

あなたの関数のパラメータが、リストされたパラメータと正確に一致することは間違いありませんが、正当な理由があります。

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

1

完全な推測で、2の経験から:

SQLのバージョンはちょうどそれが行くように変数を追加は、ストアドプロシージャをexcuteするSQLスクリプトの配列を通過します。

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()のようなReflection関数を使用して呼び出します。存在しないオブジェクトまたはフィールドを使用しているものの1つを呼び出すと、例外が発生します。