0


UpdateNamesストアド プロシージャは@Firstという名前のパラメーターを 1 つしか取りませんがLastという名前の追加のパラメーターを定義することができ、更新は引き続き成功します。

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


ただし、ObjectDataSource コントロールを扱う場合、ObjectDataSource で定義されたパラメーターの数は、UpdateNames()メソッドで定義されたパラメーターの数と正確に一致する必要があります。したがって、UpdateNames()がFirstという名前のパラメーターを 1 つだけ受け取る場合、次の例では例外が発生します。

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


A) ObjectDataSource のマッチング アルゴリズムが SqlDataSource のマッチング アルゴリズムほど柔軟でなく、余分なパラメーターを無視するのはなぜですか?


ありがとうございました

4

3 に答える 3

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
    }
}
于 2009-06-02T21:03:53.653 に答える
1

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

SQL バージョンは、ストアド プロシージャを実行するために SQL スクリプトの配列を通過するだけで、変数が追加されます。

ObjectDataSource はリフレクションを使用して、渡されたパラメーターに一致する更新メソッドを見つけます。そのため、指定されたパラメーターを受け取るオブジェクトに一致するメソッドが存在しない場合、失敗します。

于 2009-06-02T21:07:43.817 に答える
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()。存在しないオブジェクトまたはフィールドを使用してそれらのいずれかを呼び出すと、例外が発生します。

于 2009-06-02T21:08:03.347 に答える