SQL Server存储过程抛出错误

时间:2017-05-04 18:17:44

标签: sql-server stored-procedures

我收到此错误:

  

必须声明标量变量“@ECAT_ID”

如何解决这个问题?请帮帮我

 ALTER PROCEDURE [dbo].[spADDEVENT]
     (@CULTEVNT_NAME varchar(50),
      @CULTEVNT_SDATE Date,
      @CULTEVNT_EDATE Date,
      @CULTEVNT_RULES1 varchar(255),
      @CULTEVNT_RULES2 varchar(255),
      @CULTEVNT_RULES3 varchar(255),
      @CULTEVNT_RULES4 varchar(255),
      @CULTEVNT_FEES INT,
      @CULTEVNT_ADMIN VARCHAR(50),
      @ECAT_NAME VARCHAR(50),
      @E_ADMIN VARCHAR(50),
      @ESUBCAT_NAME VARCHAR(50),
      @E_ID INT,
      @ESUBCATS_ID INT,
      @ECATS_ID INT)
AS
BEGIN
    --DECLARE @ECATS_ID INT
    INSERT INTO EVENT_CAT(ECAT_ID, ECAT_NAME, E_ADMIN)
    VALUES(@ECATS_ID, @ECAT_NAME, @E_ADMIN)

    SET @ECATS_ID = SCOPE_IDENTITY();

    --DECLARE @ESUBCATS_ID INT
    INSERT INTO EVENT_SCAT(@ESUBCATS_ID, @ECAT_ID, @ESUBCAT_NAME)
    VALUES(@ESUBCATS_ID, @ECATS_ID, @ESUBCAT_NAME)

    SET @ESUBCATS_ID = SCOPE_IDENTITY();

    INSERT INTO CULTEVENT_T(CULTEVNT_NAME, CULTEVNT_SDATE, CULTEVNT_EDATE, 
                            CULTEVNT_RULES1, CULTEVNT_RULES2, 
                            CULTEVNT_RULES3, CULTEVNT_RULES4, 
                            CULTEVNT_FEES, CULTEVNT_ADMIN, 
                            ESUBCATS_ID, ECATS_ID, E_ID)
    VALUES (@CULTEVNT_NAME, @CULTEVNT_SDATE, @CULTEVNT_EDATE,
            @CULTEVNT_RULES1, @CULTEVNT_RULES2,
            @CULTEVNT_RULES3, @CULTEVNT_RULES4,
            @CULTEVNT_FEES, @CULTEVNT_ADMIN,
            @ESUBCATS_ID, @ECATS_ID, @E_ID)
END

检查整个存储过程是否正确?

这是我的C#代码。

 protected void addevnt_Click(object sender, EventArgs e)
{
    string spname = "spADDEVENT"; ;
    con.Open();
    SqlCommand com = new SqlCommand(spname, con);
    com.CommandType = CommandType.StoredProcedure;
    com.Parameters.AddWithValue("@CULTEVNT_NAME", txtevntname.Text.ToString());
    com.Parameters.AddWithValue("@ECAT_NAME", Textecat.Text.ToString());
    com.Parameters.AddWithValue("@ESUBCAT_NAME",Textscat.Text.ToString());
    com.Parameters.AddWithValue("@CULTEVNT_ADMIN ",txtaname.Text.ToString());
    com.Parameters.AddWithValue("@E_ADMIN", adminame.Text.ToString());
    com.Parameters.AddWithValue("@CULTEVNT_SDATE", txtesdate.Text.ToString());
    com.Parameters.AddWithValue("@CULTEVNT_EDATE", txtedate.Text.ToString());
    com.Parameters.AddWithValue("@CULTEVNT_RULES1", txtrul1.Text.ToString());
    com.Parameters.AddWithValue("@CULTEVNT_RULES2", txtrul2.Text.ToString());
    com.Parameters.AddWithValue("@CULTEVNT_RULES3", txtrule3.Text.ToString());
    com.Parameters.AddWithValue("@CULTEVNT_RULES4", Textrule4.Text.ToString());
    com.Parameters.AddWithValue("@CULTEVNT_FEES",txtfees.Text.ToString());
    com.Parameters.AddWithValue("@ESUBCATID", txtfees.Text.ToString());

    com.ExecuteNonQuery();
    con.Close();
    lblMessage1.Text = "data entered";

}

实际上我想在单个表单的不同表中插入数据。表格包含pk和fk

并且我已将表的大多数id作为标识列。

你可以查看我之前的Q,它包含表格确定

2 个答案:

答案 0 :(得分:1)

您的参数为@ECAT_ID而不是{{1}}

答案 1 :(得分:0)

描述错误并不容易,所以我在代码中使用了注释。基本上它们在变量中用于保存标识值在错误的位置,没有值,并且试图在没有值的情况下插入,并且没有set identity_insert [tbl] on... off

ALTER PROCEDURE [dbo].[spADDEVENT]
     (@CULTEVNT_NAME varchar(50),
      @CULTEVNT_SDATE Date,
      @CULTEVNT_EDATE Date,
      @CULTEVNT_RULES1 varchar(255),
      @CULTEVNT_RULES2 varchar(255),
      @CULTEVNT_RULES3 varchar(255),
      @CULTEVNT_RULES4 varchar(255),
      @CULTEVNT_FEES INT,
      @CULTEVNT_ADMIN VARCHAR(50),
      @ECAT_NAME VARCHAR(50),
      @E_ADMIN VARCHAR(50),
      @ESUBCAT_NAME VARCHAR(50),
      @E_ID INT--,
      /* if these are identity, you can not send the value
         maybe you want them as output parameters? */
      --@ESUBCATS_ID INT, 
      --@ECATS_ID INT
      )
AS
BEGIN
    DECLARE @ECATS_ID INT
    /* You do not know the value of @ECATS_ID yet, do you? So you can not insert it */
    INSERT INTO EVENT_CAT(ECAT_NAME, E_ADMIN)
    VALUES(@ECAT_NAME, @E_ADMIN)

    SET @ECATS_ID = SCOPE_IDENTITY();
    /* now you know the value of @ECATS_ID, so you can use that one in the next insert */

    DECLARE @ESUBCATS_ID INT
    /* Insert into tbl (columns) ... , not insert into tbl (@parameters) ...*/
    /* You do not know the value of @ESUBCATS_ID yet, do you? So you can not insert it */
    INSERT INTO EVENT_SCAT(ECAT_ID, ESUBCAT_NAME)
    VALUES(@ECATS_ID, @ESUBCAT_NAME)

    SET @ESUBCATS_ID = SCOPE_IDENTITY();
    /* now you know the value of @ESUBCATS_ID, so you can use that one in the next insert */

    INSERT INTO CULTEVENT_T(CULTEVNT_NAME, CULTEVNT_SDATE, CULTEVNT_EDATE, 
                            CULTEVNT_RULES1, CULTEVNT_RULES2, 
                            CULTEVNT_RULES3, CULTEVNT_RULES4, 
                            CULTEVNT_FEES, CULTEVNT_ADMIN, 
                            ESUBCATS_ID, ECATS_ID, E_ID)
    VALUES (@CULTEVNT_NAME, @CULTEVNT_SDATE, @CULTEVNT_EDATE,
            @CULTEVNT_RULES1, @CULTEVNT_RULES2,
            @CULTEVNT_RULES3, @CULTEVNT_RULES4,
            @CULTEVNT_FEES, @CULTEVNT_ADMIN,
            @ESUBCATS_ID, @ECATS_ID, @E_ID)