2009-02-26 2 views
1

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

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

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

<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 search and print book Профессиональный asp.net 3.5 в C# и VB не очень помогает.

Заранее благодарю за мой вопрос.

ответ

2

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

+0

это сработало ... большое спасибо ... –

+0

Хорошая сделка. Пожалуйста –

0

После быстрого просмотра это выглядит как значение по умолчанию не назначено параметрам вставки. Попробуйте конструктор класса параметров ...

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> 
0

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

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

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

Смежные вопросы