asp.net - sqldatasource - detailsview - используйте сохраненную процедуру для вставки записи

Я пытаюсь использовать сохраненную процедуру для вставки записи с помощью detailsview и sqldatasource. Я получаю следующую ошибку:

Процедура или функция «CustRec_iu» ожидает параметр «@firstname», который не был предоставлен.

Мое определение подробностей выглядит следующим образом:

<asp:DetailsView ID="dvCustDetails1" runat="server" AutoGenerateRows="False" 
    DataSourceID="SqlDataSource1" Height="149px" Width="469px">
            <Fields>
                <asp:BoundField DataField="FirstName" HeaderText="First Name" 
                    SortExpression="FirstName" />
                <asp:BoundField DataField="LastName" HeaderText="Last Name" 
                    SortExpression="LastName" />
                <asp:CommandField ButtonType="Button" ShowInsertButton="True" />
            </Fields>
</asp:DetailsView>

В приведенном ниже коде PageLoad выглядит следующим образом:

    SqlDataSource1.ConnectionString = Connection.ConnectionStr;

    //SqlDataSource1.InsertCommand = "INSERT INTO [customer] (firstname,lastname,active) values(@firstname,@lastname,@active)";
    SqlDataSource1.SelectCommand = "select firstname,lastname from customer";

    //SqlDataSource1.SelectCommand = "CustRec";
    SqlDataSource1.InsertCommand = "CustRec_iu";

    SqlDataSource1.InsertParameters.Clear();

    SqlDataSource1.InsertParameters.Add(new Parameter("firstname", DbType.String));
    SqlDataSource1.InsertParameters.Add(new Parameter("LastName", DbType.String));
    SqlDataSource1.InsertParameters.Add(new Parameter("Active",DbType.Int16,"1"));

Обратите внимание: если я использую закомментированный встроенный оператор, вставка работает.

Моя сохраненная процедура выглядит следующим образом:

ALTER PROCEDURE dbo.CustRec_iu
    (
    @custid int = null,
    @firstname varchar(100),
    @lastname varchar(100),
    @Active bit = 1 
    )

AS
    if (isnull(@custid,0) = 0)
    begin
        insert into customer
            (firstname,lastname,Active) 
        values
            (@firstname,@lastname,@Active)
    end
    else
    begin
        update customer 
        set 
            [email protected], 
            lastname= @lastname, 
            active = @Active
        where 
            custid = @custid
    end
    /* SET NOCOUNT ON */
    RETURN

Что я не понимаю, как входной параметр взаимодействует между sqldatasource, detailsview и т. Д. Как он работает с инструкцией insline и не работает с сохраненной процедурой? Как sql datasource и detailsview работают с точки зрения событий? Поиск и печать Google книги Professional asp.net 3.5 на C# и VB не очень помогает.

Заранее спасибо, что прочитали мой вопрос.

Ответов (3)

Решение

Я думаю, ты можешь скучать SqlDataSource1.InsertCommandType = CommandType.StoredProcedure

После беглого просмотра кажется, что значение по умолчанию не присвоено параметрам вставки. Попробуйте конструктор класса Parameter ...

New Parameter(name, dbType, defaultValue)

Кроме того, вам, вероятно, не нужно использовать sqldatasource в исходном коде. Вы можете попробовать следующее.

<asp:DetailsView DataSourceID="SqlDataSource1" Height="149px" Width="469px">
   <Fields>
      <asp:BoundField DataField="FirstName" HeaderText="First Name" SortExpression="FirstName" />
      <asp:BoundField DataField="LastName" HeaderText="Last Name" SortExpression="LastName" />
      <asp:CommandField ButtonType="Button" ShowInsertButton="True" />
   </Fields>
</asp:DetailsView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:YourConnectionString %>"
   InsertCommand="CustRec_iu"
   InsertCommandType="StoredProcedure" 
   SelectCommand="select firstname,lastname from customer" 
   SelectCommandType="Text">
        <InsertParameters>
            <asp:Parameter Name="firstname" Type="String" />
            <asp:Parameter Name="LastName" Type="String" />
            <asp:Parameter Name="Active" Type="String" DefaultValue="1" />
        </InsertParameters>
</asp:SqlDataSource>

Встроенные операторы работают так же, как sproc, за исключением того, что вы создаете строку с операторами @param, встроенными в строку.

Вам просто нужно вытащить обновление и вставить инструкцию в свой sproc. Затем вам нужно создать ссылки на параметры.

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