Почему алгоритм сопоставления ObjectDataSource не такой гибкий, как ...? - PullRequest
0 голосов
/ 03 июня 2009


Даже если UpdateNames хранимая процедура принимает только один параметр с именем @ First , мы все еще можем определить дополнительный параметр с именем 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 , следующее вызовет исключение

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


A) Почему алгоритм сопоставления ObjectDataSource не такой гибкий, как алгоритм сопоставления SqlDataSource, и поэтому игнорирует любые дополнительные параметры?


Спасибо

Ответы [ 3 ]

2 голосов
/ 03 июня 2009

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
    }
}
1 голос
/ 03 июня 2009

Вы можете думать об этом, как будто ваш 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, как если бы он был переведен в вызовы с использованием функций Reflection, таких как PropertyInfo.GetValue() и PropertyInfo.SetValue(). Если вы вызовете один из тех, кто использует несуществующий объект или поле, вы получите исключение.

1 голос
/ 03 июня 2009

Полное предположение, из опыта с двумя:

Версия SQL будет просто проходить через массив сценарий SQL, чтобы оправдать хранимую процедуру, добавляя переменные по мере их поступления.

ObjectDataSource использует отражение, чтобы найти метод обновления, который соответствует переданным параметрам. Таким образом, происходит сбой, если не существует подходящего метода для объекта, который принимает предоставленные параметры.

...