存储过程未使用参数显示错误

时间:2014-04-24 08:10:16

标签: asp.net stored-procedures

收到的错误是:

  

过程或函数SPCustomerDetails需要参数' @ address',这是未提供的。

     

描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

     

异常详细信息:System.Data.SqlClient.SqlException:过程或函数' SPCustomerDetails'期望参数' @ address',这是未提供的。

我的存储过程是:

ALTER  PROCEDURE [dbo].[SPCustomerDetails]
(
@id varchar,
@title varchar(50),
@fname varchar(50),
@Lname varchar(50),
@mob varchar(50),
@email varchar(50),
@password varchar(50),
@address varchar(50),
@altemail varchar(50),
@gender varchar(50),
@dob varchar(50),
@city varchar(50),
@country varchar(50),
@state varchar(50),
@checked varchar(50),
@opr varchar(50)

)
as
begin
    if @opr='BTNNEW'
    INSERT INTO TblCustomer_Details
    (FName,LName,Email,Password,Contact_No,checked)
     VALUES
     (@fname,@Lname,@email,@password,@mob,@checked)

     else if @opr='BTNUPDATE'
     Update  TblCustomer_Details 
     set
        Title=@title,
        FName=@fname,
        LName=@Lname,
        Email=@email,
        alt_Email=@altemail,
        Address=@address,
        Password=@password,
        Gender=@gender,
        DOB=@dob,
        Contact_No=@mob,
        Country=@country,
        State=@state,
        City=@city
        where 
        Cust_ID=@id

    else if @opr='BTNDELETE'
    delete TblCustomer_Details 
    from TblCustomer_Details
    where
    Cust_ID=@id

执行程序:

con.ExeQry(" exec SPCustomerDetails '" + fname.Text.Trim() + "',N'" + 
  lname.Text.Trim() + "',N'" + pemail.Text.Trim() + "',N'" + 
  cpassword.Text.Trim() + "',N'" + mobile.Text.Trim() + "',N'" + 
  offers.Checked + "','" + opr.ToUpper() + "'");

3 个答案:

答案 0 :(得分:0)

尝试这种技巧: -

    CREATE PROCEDURE ProcName

    @Parameter1 VARCHAR (100) = NULL
AS

/* check for the NULL */ 
if (@Parameter1 IS NULL)
BEGIN
    /* your code*/

END

/* In Query*/
SELECT *
FROM Table
WHERE Column = @Parameter1

答案 1 :(得分:0)

con.ExeQry(" exec SPCustomerDetails '" + fname.Text.Trim() + "',N'" + lname.Text.Trim() + "',N'" + pemail.Text.Trim() + "',N'" + cpassword.Text.Trim() + "',N'" + mobile.Text.Trim() + "',N'" + offers.Checked + "','" + opr.ToUpper() + "'");

你在con.ExeQry中给出的字符串就像这样显示

exec SPCustomerDetails'fname',N'lname',N'mobile',N'pemail',N'pwd',N'offers','opr'

它抛出sql异常

这里我采取fname.Text.Trim()= fname,lname.Text.Trim()= lname ......

它应该像这样

exec SPCustomerDetails'fname','Nlname','Npemail','Npwd','Nmovile','Noffers','opr'

你说你第一次传递7个参数。所以第一次传递NULL,你不想传递像这样的参数

exec SPCustomerDetails NULL,NULL, 'FNAME',” Nlname”,NULL,” Npemail”,” Npwd”,NULL,” Nmovile”,” Noffers',NULL,NULL,NULL,NULL,NULL, 'OPR'

我只是用sqlquery样式编写查询将其转换为您的Asp.net样式

像  con.ExeQry(“exec SPCustomerDetails .....

你给出了不同的顺序,而参数传递你应该以你在存储过程中提到的方式给出参数

答案 2 :(得分:0)

您的问题是您希望将某些字段声明为可选字段。不幸的是,根据给出的代码,您似乎假设SQL将根据您传递给SPCustomerDetails的调用的变量名称“计算出”您的意思。

您的存储过程调用仅解析为:

exec SPCustomerDetails 'Bob', N'Smith', N'bob@sample.com', N'hunter2',
    N'07111 1234', N'True', 'True'

将传入以填充前七个参数;第八个,@address,将是第一个没有价值因此你看到的错误。

如果希望在存储过程调用中具有默认值(因此可选),可以在过程定义中通过在参数后面加上默认值来声明它;例如:

ALTER  PROCEDURE [dbo].[SPCustomerDetails]
(
    @id varchar,
    @title varchar(50) = null,
    @fname varchar(50),
    ...

不需要传入@title字段。您还需要更改存储过程调用以直接填充各个参数。您的数据库调用需要阅读:

exec SPCustomerDetails @fname = 'Bob',
                       @lname = 'Smith',
                       @email = 'bob@sample.com'

或代码:

con.ExeQry(" exec SPCustomerDetails @fname = '" + fname.Text.Trim() + "'," +
                                  " @lname = '" + lname.Text.Trim() + "'," +
                                  " @email = '" + email.Text.Trim() + "'," +
...

那就是说,这个代码还有另外两个问题也应该解决,修复范围超出了这个答案的范围:

  1. 您应该对存储过程调用进行参数化,而不是将所有内容直接编码为单个字符串;代码原样让您对SQL注入攻击持开放态度。
  2. 根据我可以看到的代码,您直接从用户界面获取密码并将其存储在数据库中。您永远不会以纯文本格式存储密码;它应该在最小的时候进行散列和盐渍。