Обновление ObjectDataSource

У меня есть gridview (CustomerDetails) с включенным редактированием. Когда я нажимаю кнопку редактирования и обновляю одно из полей 5/6 (я изменил все поля на поле шаблона, а затем установил шаблон редактирования на метку для полей, которые я не хотел редактировать), я получаю сообщение об ошибке:

«ObjectDataSource 'ObjectDataSource1' не смог найти неуниверсальный метод 'UpdateCustomerAddressZip' с параметрами: CustomerID, CustomerAddressOne, CustomerAddressTwo, CustomerZip, original_CustomerID»

Код источника данных объекта:

    <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" InsertMethod="InsertCustomer"
        OldValuesParameterFormatString="original_{0}" SelectMethod="CustomerDetails" UpdateMethod="UpdateCustomerAddressZip"
        TypeName="Enterprise.CustomerEntityLayer">
        <InsertParameters>
            <asp:Parameter Name="CustomerID" Type="Int32" />
            <asp:Parameter Name="CustomerAddressOne" Type="String" />
            <asp:Parameter Name="CustomerAddressTwo" Type="String" />
            <asp:Parameter Name="CustomerZip" Type="String" />
        </InsertParameters>
        <UpdateParameters>
        <asp:Parameter Name="CustomerID" Type="Int32" />
        <asp:Parameter Name="CustomerAddressOne" Type="String" />
        <asp:Parameter Name="CustomerZip" Type="String" />
        </UpdateParameters>
        <SelectParameters>
            <asp:ControlParameter ControlID="Gridview1" DbType="Int32" Name="CustomerID" PropertyName="SelectedValue" />
        </SelectParameters>
    </asp:ObjectDataSource>

И мой метод на уровне сущности:

Public Function UpdateCustomerAddressZip(ByVal CustomerID As Integer, ByVal CustomerAddressOne As String, ByVal CustomerZip As Integer)
                Dim dt As New CustomerDataTable
                Dim C_row As CustomerRow = dt.NewCustomerRow

                    C_row.CustomerID = CustomerID
                    C_row.CustomerAddressOne = CustomerAddressOne
                    C_row.CustomerZip = CustomerZip

                Adapter.UpdateCustAddZip(CustomerID, CustomerAddressOne, CustomerZip)
            End Function

Поскольку SQL

UPDATE Customer
SET CustomerAddressOne = @CustomerAddressOne,
CustomerZip = @CustomerZip
WHERE CustomerID=@CustomerID

Может ли кто-нибудь посоветовать, где я ошибаюсь?

Спасибо


person Community    schedule 11.10.2012    source источник


Ответы (1)


Простой ответ: замените OldValuesParameterFormatString = "original_ {0}" на OldValuesParameterFormatString = "{0}".

Как видно из ошибки:

«ObjectDataSource 'ObjectDataSource1' не смог найти неуниверсальный метод 'UpdateCustomerAddressZip' с параметрами: CustomerID, CustomerAddressOne, CustomerAddressTwo, CustomerZip, original_CustomerID»

есть дополнительный параметр: original_CustomerID

Это необходимо на тот случай, если вы хотите реализовать оптимистичный параллелизм, чтобы гарантировать, что обновление, которое вы выполняете в базе данных, не конфликтует с чьими-либо изменениями.

Это прекрасно объяснено в этом руководстве Скотта Митчелла. Я сообщаю соответствующую часть здесь для удобства:

Одним из побочных эффектов использования мастера для настройки ObjectDataSource является то, что Visual Studio устанавливает для свойства OldValuesParameterFormatString значение original_ {0}. Это значение свойства используется для включения исходных значений редактируемых данных и полезно в двух сценариях:

  • Если при редактировании записи пользователи могут изменить значение первичного ключа. В этом случае необходимо предоставить и новое значение первичного ключа, и исходное значение первичного ключа, чтобы можно было найти запись с исходным значением первичного ключа и соответствующим образом обновить ее значение.

  • При использовании оптимистичного параллелизма. Оптимистический параллелизм - это метод, гарантирующий, что два одновременных пользователя не перезаписывают изменения друг друга, и это тема для будущего руководства.

Свойство OldValuesParameterFormatString указывает имя входных параметров в методах обновления и удаления базового объекта для исходных значений. Мы обсудим это свойство и его назначение более подробно при изучении оптимистичного параллелизма. Однако я поднимаю его сейчас, потому что наши методы BLL не ожидают исходных значений, и поэтому важно удалить это свойство. Если оставить для свойства OldValuesParameterFormatString любое значение, кроме значения по умолчанию ({0}), это вызовет ошибку, когда веб-элемент управления данными попытается вызвать методы Update () или Delete () ObjectDataSource, потому что ObjectDataSource попытается передать как UpdateParameters, так и Указанные параметры DeleteParameters, а также параметры исходного значения.

Если на данном этапе это не совсем понятно, не волнуйтесь, мы рассмотрим это свойство и его полезность в одном из будущих руководств. На данный момент просто обязательно либо полностью удалите это объявление свойства из декларативного синтаксиса, либо установите значение по умолчанию ({0}).

Примечание. Если вы просто удалите значение свойства OldValuesParameterFormatString из окна «Свойства» в представлении «Дизайн», свойство все равно будет существовать в декларативном синтаксисе, но для него будет установлена ​​пустая строка. Это, к сожалению, по-прежнему приведет к той же проблеме, о которой говорилось выше. Поэтому либо полностью удалите свойство из декларативного синтаксиса, либо в окне «Свойства» установите значение по умолчанию, {0}.

НО, это также связано с Свойство SqlDataSource.ConflictDetection

Как указано там, только когда для ConflictDetection установлено значение CompareAllValues ​​, дополнительные параметры должны быть добавлены к вызову метода обновления (и точное имя параметров для исходных значений зависит от свойства OldValuesParameterFormatString.)

По умолчанию для свойства ConflictDetection установлено значение OverwriteChanges, что означает, что элемент управления источником данных перезапишет любые изменения, внесенные в строку данных за время элемент управления источником данных сначала считывает данные из строки и время обновления строки. Первичный ключ используется для поиска строки данных, которая будет обновлена ​​или удалена, но никакое другое сравнение данных не выполняется. Однако, если элемент управления источником данных настроен на использование параметра CompareAllValues, элемент управления передает исходные данные в коллекциях oldValues ​​методов Update и Delete, чтобы вы могли написать логику для обновления или удаления данных только в том случае, если эти значения соответствуют текущим значениям. в хранилище данных. Соответствующие значения указывают на то, что данные не изменились с момента чтения.

Так что мне это не совсем понятно ... Похоже, что если по умолчанию для свойства ConflictDetection установлено значение OverwriteChanges, никакие дополнительные параметры * original_ {0} * не должны добавляться в UpdateMethod!

person spiderman    schedule 24.10.2012