【问题标题】:Stored Procedure runs in SQL Management Studio but not in Code存储过程在 SQL Management Studio 中运行,但不在代码中
【发布时间】:2013-07-31 01:02:28
【问题描述】:

我正在输入和更新两个表中的数据,在 SQl 服务器中使用 SP 工作创建查询是可以的,但是在 C# 中查询一个表单会产生错误。

这是我的表定义:

CREATE TABLE [dbo].[nationality](
    [nationalitycode] [int] IDENTITY(1,1) NOT NULL,
    [nationality] [nvarchar](50) NULL,
        CONSTRAINT [PK_nationality] PRIMARY KEY CLUSTERED 
(
    [nationalitycode] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[user]   
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-------------------------------------------------------------------------------------------
CREATE TABLE [dbo].[user](
    [code] [int] IDENTITY(1,1) NOT NULL,
    [name] [nvarchar](50) NULL,
    [lastname] [nvarchar](50) NULL,
    [nationalitycode] [int] NULL,
        CONSTRAINT [PK_user] PRIMARY KEY CLUSTERED 
(
    [code] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

当我运行以下代码来编辑我得到的数据时:

Sqlexception 未处理 过程或函数 'sp_update' 期望 未提供参数“@lastName”。

private void btnRec_Click(object sender, EventArgs e)
{
   SqlCommand cmd = new SqlCommand("", cn);
   cmd.CommandType = CommandType.StoredProcedure;
   cn.Open();
   int fila = 0;
   switch (menup)
   {
      case menu.New:
         cmd.CommandText = "sp_insertdata";
         cmd.Parameters.AddWithValue("code", 0);
         cmd.Parameters.AddWithValue("name", txtName.Text);
         cmd.Parameters.AddWithValue("lastName", txtlastName.Text);
         cmd.Parameters.AddWithValue("nationality", txtNationality.Text);
         cmd.Parameters["code"].Direction = ParameterDirection.Output;
         fila = cmd.ExecuteNonQuery();
         if (fila!=0)
         {
             MessageBox.Show("Good Registry" +      cmd.Parameters["code"].Value.ToString());
         }
         break;

这是我的编辑代码:

case menu.Edit:
   cmd.CommandText = "sp_update";
    cmd.Parameters.AddWithValue("code", txtCode.Text);
    cmd.Parameters.AddWithValue("name", txtName.Text);
    cmd.Parameters.AddWithValue("lastname", txtLastName.Text);
    cmd.Parameters.AddWithValue("nationality", txtNationality.Text);
    fila = cmd.ExecuteNonQuery();
    if (fila!=0)
    {
       MessageBox.Show("Update ok" +  cmd.Parameters["code"].Value.ToString());
    }
    break;

当我运行编辑代码时,我得到:

Sqlexception 未处理 过程或函数 'sp_update' 期望 未提供参数“@lastName”。

这里是存储过程定义:

ALTER proc [dbo].[sp_insertdata]
@name nvarchar(50),
@lastname nvarchar(50),
@nationality nvarchar(50)
as
if  not exists(select * from nationality where nationality=@nationality)
begin
insert into nationality(nationality)values(@nationality)
end
declare @id int
select @id=nationalitycode from nationality where nationality=@nationality

insert into usuario(name,lastname,nationalitycode) values (@name,@lastname,@id)

/************ *************** *************** ********/

ALTER proc [dbo].[sp_update]
@code int,
@name varchar(50),
@lastname varchar(50),
@nationality varchar(50)
as

if not exists (select * from nationality where nationality=@nationality)
begin
insert  into nationality(nationality)values(@nationality)
end

update user
SET  name= @name,lastname=@lastname,nationalitycode=(select nationalitycode from nationality where nationality=@nationality)
where code = @code

【问题讨论】:

    标签: c# c#-4.0 stored-procedures ado.net


    【解决方案1】:

    您的插入存储过程和插入代码存在问题。存储过程没有代码参数,但您将其作为输入传递。您的代码应为:

    case menu.New:
        cmd.CommandText = "sp_insertdata";
        cmd.Parameters.AddWithValue("@name", txtName.Text);
        cmd.Parameters.AddWithValue("@lastName", txtlastName.Text);
        cmd.Parameters.AddWithValue("@nationality", txtNationality.Text);
        cmd.Parameters["code"].Direction = ParameterDirection.Output;
        fila = cmd.ExecuteNonQuery();
    

    插入存储过程应包含代码作为输出:

    ALTER proc [dbo].[sp_insertdata]
       @name nvarchar(50),
       @lastname nvarchar(50),
       @nationality nvarchar(50),
       @code int output
    as
       if  not exists(select * from nationality where nationality=@nationality)
       begin
        insert into nationality(nationality)values(@nationality)
       end
       declare @id int
       select @id=nationalitycode from nationality where nationality=@nationality
    
       insert into usuario(name,lastname,nationalitycode) values (@name,@lastname,@id)
    
       SET @code=SCOPE_IDENTITY()
    

    对于您的更新代码,我将更改为:

    cmd.CommandText = "sp_update";
    cmd.Parameters.AddWithValue("@code", txtCode.Text);
    cmd.Parameters.AddWithValue("@name", txtName.Text);
    cmd.Parameters.AddWithValue("@lastname", txtLastName.Text);
    cmd.Parameters.AddWithValue("@nationality", txtNationality.Text);
    

    【讨论】:

    • 反应很好,现在我还有一个小问题要更新表格上的表格,只显示在文本字段中。字段代码中记录的数字我可以删除代码数字并更新记录..有什么办法解决吗?
    • @Andreu:您的后续问题似乎超出了原始问题的范围——您可能想将其作为一个单独的问题提出。 (您可能还想改写一下,因为我不知道您在问什么;)如果对您有用,请记住将问题标记为已接受。
    猜你喜欢
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 2017-10-02
    相关资源
    最近更新 更多