我正在尝试使用stored proc来使用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
firstname=@firstname,
lastname= @lastname,
active = @Active
where
custid = @custid
end
/* SET NOCOUNT ON */
RETURN
我不明白输入参数如何在sqldatasource,detailsview等之间进行交互。它如何与insline语句一起使用而不用于存储过程? sql datasource和detailsview如何在事件方面工作?谷歌搜索和打印书籍c#和VB中的专业asp.net 3.5并没有多大帮助。
提前感谢您阅读我的问题。
答案 0 :(得分:2)
我想你可能会遗漏SqlDataSource1.InsertCommandType = CommandType.StoredProcedure
答案 1 :(得分:0)
快速查看后,看起来默认值未分配给insert参数。尝试使用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>
答案 2 :(得分:0)
内联语句的工作方式与sproc类似,不同之处在于您使用嵌入在字符串中的@param语句创建字符串。
您应该只需在您的sproc中提取更新并插入语句。然后,您必须创建参数链接。
如果要进行此拖放操作,请将update语句插入向导中。最糟糕的情况是添加参数映射。所以,这里的拖放并没有真正提供太多。