2009-02-26 70 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")); 

注意,如果我用注释掉inline语句然后在插入的作品。

我的存储过程如下所示:

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数据源和detailsview如何在事件方面工作?谷歌搜索和打印专业的asp.net 3.5在c#和VB中没有太大的帮助。

预先感谢您阅读我的问题。

回答

2

我想你可能会丢失SqlDataSource1.InsertCommandType = CommandType.StoredProcedure

+0

这个工作...非常感谢你... – 2009-02-27 02:44:38

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

在线statesments工作就像存储过程,除非你创建嵌入字符串中的@参数语句的字符串。

你只需要在你的sproc中插入你的更新和插入语句即可。然后您必须创建参数链接。

如果您想要进行此拖放,请将更新语句插入向导。最糟糕的情况是添加参数映射。所以,这里的拖放并没有真正提供。

相关问题