我怎样才能得到这个执行?
问题描述:
我有一系列输入源,我想用它来执行我的sql数据库上的存储过程。存储过程如下所示:我怎样才能得到这个执行?
USE [InvoiceSHC]
GO
/****** Object: StoredProcedure [dbo].[UpdateSHCInvoice] Script Date: 02/21/2013 12:03:58 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[UpdateSHCInvoice]
-- Add the parameters for the stored procedure here
@Ref nvarchar(50),
@PhaseName nvarchar(50),
@PageType nvarchar(50),
@Page float,
@Percent nvarchar(50),
@ChngType nvarchar(50),
@RowCount int output
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
insert into MasterData2 ([Ad],[Phase],[Page Type] , [Page Rate], [Percent] , [Change Type])
values(@Ref, @PhaseName , @PageType , @Page , @Percent ,@ChngType);
/* @@ROWCOUNT returns the number of rows that are affected by the last statement. */
select @RowCount = @@ROWCOUNT
END
我在窗体上有一个按钮,提示用户更新表。这是它的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
namespace WebApplication1
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
}
protected void MasterData_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
{
}
protected void btnUpdate_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection("server=(local);database=InvoiceSHC;Trusted_Connection=Yes");
SqlDataAdapter DA = new SqlDataAdapter("UpdateSHCInvoice", con);
SqlCommand cmd = new SqlCommand("UpdateSHCInvoice", con);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter Ref = cmd.Parameters.Add("@Ref", SqlDbType.NVarChar, 50);
SqlParameter Phase = cmd.Parameters.Add("@Phase", SqlDbType.NVarChar, 50);
SqlParameter PageType = cmd.Parameters.Add("@PageType", SqlDbType.NVarChar, 50);
SqlParameter Page = cmd.Parameters.Add("@Page", SqlDbType.NVarChar, 50);
SqlParameter Percent = cmd.Parameters.Add("@Percent", SqlDbType.Float);
SqlParameter ChngType = cmd.Parameters.Add("@ChngType", SqlDbType.NVarChar, 50);
Ref.Value = dlRef.SelectedItem;
Phase.Value = dlPhase.SelectedItem;
PageType.Value = dlPageType.SelectedItem;
Page.Value = tbPage.Text;
Percent.Value = dlPercent.SelectedItem;
ChngType.Value = dlChngType.SelectedItem;
con.Open();
cmd.ExecuteNonQuery();
}
}
}
当我拿出cmd.ExecuteNonQuery()时,我得到没有错误,也没有结果。当我在那里有结果是一个错误System.InvalidCastException:对象必须实现IConvertible。
我为自己的无知事先道歉,我自学成才,每天都在学习新东西。在大约127年和4天内,我可能会理解这一点。
答
除了传递SelectedItem.Value
而不是SelectedItem
本身,如果你在一个using
块执行你的命令(如下),您不必担心离开连接打开。您也可以使用Parameters.AddWithValue()
删除大量行。
using(SqlConnection con = new SqlConnection("yourConnectionString"))
{
//Not sure why you need a SqlDataAdapter unused here.
//SqlDataAdapter DA = new SqlDataAdapter("UpdateSHCInvoice", con);
SqlCommand cmd = new SqlCommand("UpdateSHCInvoice", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@Ref", dlRef.SelectedItem.Value);
cmd.Parameters.AddWithValue("@Phase", dlPhase.SelectedItem.Value);
cmd.Parameters.AddWithValue("@PageType", dlPageType.SelectedItem.Value);
cmd.Parameters.AddWithValue("@Page", tbPage.Text);
cmd.Parameters.AddWithValue("@Percent", dlPercent.SelectedItem.Value);
cmd.Parameters.AddWithValue("@ChngType", dlChngType.SelectedItem.Value);
con.Open();
cmd.ExecuteNonQuery();
}
答
您正在寻找添加值,而不是相应的对象到数据库。
纠正你这样的代码
Ref.Value = dlRef.SelectedItem.Value;
Phase.Value = dlPhase.SelectedItem.Value;
PageType.Value = dlPageType.SelectedItem.Value;
Page.Value = tbPage.Text;
Percent.Value = dlPercent.SelectedItem.Value;
ChngType.Value = dlChngType.SelectedItem.Value;
答
在您的存储过程,@Page是float类型,但在点击方法,则需要到的值赋给tbPage.text。你必须转换成正确的类型。
nunespascal - 非常感谢你,这个着名的作品。我需要最后一件事才能完成。一旦我完成插入,我有一个gridview(gridview1)需要根据屏幕上的信息刷新。可以将它们合并到相同的代码中吗? – 2013-02-21 19:06:04
如果你的gridview已经绑定到数据源,你只需要调用'DataBind' – nunespascal 2013-02-22 04:05:23