当前位置: 代码迷 >> Sql Server >> ASP.NET 调用存储过程报错
  详细解决方案

ASP.NET 调用存储过程报错

热度:356   发布时间:2016-04-24 09:05:40.0
求助:ASP.NET 调用存储过程报错
这是我的C#语句,调用存储过程[UserInfoProc]
protected void Create_Click(object sender, EventArgs e)
    {
        //提交创建用户
        string powerID = "000,001";   //测试权限,根据复选框组合

        SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["connectDataBase"].ConnectionString);
        conn.Open();
        SqlCommand cmd = new SqlCommand("UserInfoProc", conn);
        //给传给存储过程的参数定义、赋值
        SqlParameter[] param = new SqlParameter[]
        {
            new SqlParameter("@USERNAME",SqlDbType .VarChar ,50)    {Value = this.UserName.Text.ToString()},
            new SqlParameter("@DEPARTID",SqlDbType .VarChar ,20)    {Value = this.Depart.SelectedValue.ToString()},
            new SqlParameter("@POWERID",SqlDbType .VarChar ,200)    {Value = powerID},
            new SqlParameter("@NAME",SqlDbType .VarChar ,50)        {Value = this.Name.Text.ToString()},
            new SqlParameter("@Return",SqlDbType.Int),
        };
        param[4].Direction = ParameterDirection.ReturnValue;

        param[4].Direction = ParameterDirection.Output;
        foreach (SqlParameter parameter in param)
        {
            cmd.Parameters.Add(parameter);
        }
        cmd.ExecuteNonQuery();
        string ret = cmd.Parameters["@Return"].Value.ToString();
        conn.Close();

    }

存储过程内容
USE [CapManagementSys]
GO
/****** Object:  StoredProcedure [dbo].[UserInfoProc]    Script Date: 2015/5/16 11:18:55 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

/*用户信息--新增、修改 */
ALTER PROCEDURE [dbo].[UserInfoProc]
@USERNAME varchar(50),
@DEPARTID varchar(20),
@POWERID varchar(200),
@NAME varchar(50), 
@Return int output

AS
DECLARE @PASSWORD varchar(100) = '41F212FBA540D6C3'
SET @Return = 0
BEGIN
DECLARE @COUNT INT = 0
SELECT @COUNT=@@ROWCOUNT FROM UserInfo A WHERE A.USERNAME = @USERNAME
IF (@COUNT != 0)
BEGIN
SET @Return = -2
END
ELSE
BEGIN
INSERT INTO UserInfo(USERNAME,PASSWORD,DEPARTID,POWERID,NAME) VALUES(@USERNAME,@PASSWORD,@DEPARTID,@POWERID,@NAME)
END
END

跟踪出来的数据库查询语句是:
declare @p7 int
set @p7=NULL
exec sp_executesql N'UserInfoProc',N'@USERNAME varchar(50),@DEPARTID varchar(20),@POWERID varchar(200),@NAME varchar(50),@Return int output',@USERNAME='123',@DEPARTID='04',@POWERID='000,001',@NAME='123',@Return=@p7 output
select @p7

但是查询报错:
消息 201,级别 16,状态 4,过程 UserInfoProc,第 0 行
过程或函数 'UserInfoProc' 需要参数 '@USERNAME',但未提供该参数。
请问各位大神我哪里出错了呢。。谢谢~
------解决思路----------------------
引用:
Quote: 引用:

在使用 sp_executesql 的时候, 第一个参数是存储过程名, 其后要把参数全写上.
但是
declare @p7 int
set @p7=NULL
exec sp_executesql N'UserInfoProc',N'@USERNAME varchar(50),@DEPARTID varchar(20),@POWERID varchar(200),@NAME varchar(50),@Return int output',@USERNAME='123',@DEPARTID='04',@POWERID='000,001',@NAME='123',@Return=@p7 output
select @p7

是根据C#代码自动生成的查询语句呢。。难道是代码有什么问题么0.0.

这样,命令类型不对
cmd.CommandType = System.Data.CommandType.StoredProcedure;
  相关解决方案