1

私はいくつかのプロジェクトに取り組んでおり、このエラーメッセージを受け取りました:

*プロシージャまたは関数 SP_XXX に指定された引数が多すぎます* 以下は、ASP c# を通過する私の SQL パラメータです。アプリは多くのサイトをチェックしましたが、何も得られませんでした :) ご協力ありがとうございました!

        cmd.Parameters.Add(new SqlParameter() { Value = user.CODE, ParameterName = "@CODE" });cmd.Parameters.Add(new SqlParameter() { Value = CODE, ParameterName = "@OLD_CODE" });
        cmd.Parameters.Add(new SqlParameter() { Value = COCODE, ParameterName = "@OLD_COCODE" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.COCODE, ParameterName = "@COCODE" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.MEMBERTYPE, ParameterName = "@MEMBERTYPE" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.ENNAME, ParameterName = "@ENNAME" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.ARNAME, ParameterName = "@ARNAME" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.NATIONALITY, ParameterName = "@NATIONALITY" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.GENDER, ParameterName = "@GENDER" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.SPECIAL, ParameterName = "@SPECIAL" });
        cmd.Parameters.Add(new SqlParameter() { Value = (object)user.BIRTHDATE ?? DBNull.Value, ParameterName = "@BIRTHDATE" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.Religion, ParameterName = "@RELIGION" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.QUALIFY, ParameterName = "@QUALIFY" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.MEMBERPOS, ParameterName = "@MEMBERPOS" });
        cmd.Parameters.Add(new SqlParameter() { Value = (object)user.JOINDATE ?? DBNull.Value, ParameterName = "@JOINDATE" });
        cmd.Parameters.Add(new SqlParameter() { Value = (object)user.EXPIRYDATE ?? DBNull.Value, ParameterName = "@EXPIRYDATE" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.POBOX, ParameterName = "@POBOX" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.WORKTEL, ParameterName = "@WORKTEL" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.HOMETEL, ParameterName = "@HOMETEL" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.MOBILE, ParameterName = "@MOBILE" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.FAX, ParameterName = "@FAX" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.EMAIL, ParameterName = "@EMAIL" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.WEBSITE, ParameterName = "@WEBSITE" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.ACCCODE, ParameterName = "@ACCCODE" });

        cmd.Parameters.Add(new SqlParameter() { Value = user.AMOUNT, ParameterName = "@AMOUNT" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.PAIDAMOUNT, ParameterName = "@PAIDAMOUNT" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.EMIRATE, ParameterName = "@EMIRATE" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.MILIT_NO, ParameterName = "@MILIT_NO" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.GRADE, ParameterName = "@GRADE" });

        //need job

        cmd.Parameters.Add(new SqlParameter() { Value = user.NEEDJOB, ParameterName = "@NEEDJOB" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.DEBIT, ParameterName = "@DEBIT" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.JOBNAME, ParameterName = "@JOBNAME" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.BNKNAME, ParameterName = "@BNKNAME" });
        cmd.Parameters.Add(new SqlParameter() { Value = (object)user.BNKAMOUNT ?? DBNull.Value, ParameterName = "@BNKAMOUNT" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.COMPAGNY, ParameterName = "@COMPAGNY" });
        cmd.Parameters.Add(new SqlParameter() { Value = (object)user.COMPAMOUNT ?? DBNull.Value, ParameterName = "@COMPAMOUNT" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.PRSN, ParameterName = "@PRSN" });
        cmd.Parameters.Add(new SqlParameter() { Value = (object)user.PRSNAMOUNT ?? DBNull.Value, ParameterName = "@PRSNAMOUNT" });
        if (user.PIC == null)
            cmd.Parameters.Add(new SqlParameter() { Value = DBNull.Value, ParameterName = "@PIC", SqlDbType = System.Data.SqlDbType.Image });
        else
            cmd.Parameters.Add(new SqlParameter() { Value = user.PIC, ParameterName = "@PIC" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.COMPANY, ParameterName = "@COMPANY" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.TYPEBLOOD, ParameterName = "@TYPEBLOOD" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.PASSPORTNUM, ParameterName = "@PASSPORTNUM" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.LEAVENUM, ParameterName = "@LEAVENUM" });
        cmd.Parameters.Add(new SqlParameter() { Value = user.POSBEFORE, ParameterName = "@POSBEFORE" });
 cmd.Parameters.Add(new SqlParameter() { Value = (object)user.LEAVEDATE ?? DBNull.Value, ParameterName = "@LEAVEDATE" });
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        cmd.CommandText = "SP_MSMEMBERS_UPDATE";
        cmd.Connection = con;
        string constr = ConfigurationManager.ConnectionStrings["ConnectionStrings"].ToString();
        con.ConnectionString = constr;
        con.Open();
        int x = cmd.ExecuteNonQuery();

        con.Close();

    ALTER PROCEDURE [dbo].[SP_MSMEMBERS_UPDATE] 
       (
 @CODE VARCHAR(10),
 @OLD_CODE VARCHAR(10),
 @COCODE INTEGER,
 @OLD_COCODE INTEGER,
 @MEMBERTYPE INTEGER,
 @ENNAME VARCHAR(40),
 @ARNAME VARCHAR(40),
 @NATIONALITY INTEGER,
 @GENDER VARCHAR(1),
 @SPECIAL VARCHAR(1),
 @BIRTHDATE DATETIME,
 @RELIGION INTEGER,
 @QUALIFY INTEGER,
 @MEMBERPOS VARCHAR(40),
 @JOINDATE DATETIME,
 @EXPIRYDATE DATETIME,
 @POBOX VARCHAR(15),
 @WORKTEL VARCHAR(30),
 @HOMETEL VARCHAR(30),
 @MOBILE  VARCHAR(30),
 @FAX  VARCHAR(30),
 @EMAIL VARCHAR(40),
 @WEBSITE VARCHAR(80),
 @ACCCODE VARCHAR(20),
 @AMOUNT NUMERIC(15,3),
 @PAIDAMOUNT NUMERIC(15,3),
 @EMIRATE INTEGER,
 @MILIT_NO VARCHAR(40),
 @GRADE VARCHAR(20)
 --new add
 ,@NEEDJOB VARCHAR(1) 
 ,@DEBIT VARCHAR(1)
 ,@JOBNAME varchar(20)
 ,@BNKNAME varchar(25)
 ,@BNKAMOUNT NUMERIC(15,3)
 ,@COMPAGNY nvarchar(25)
 ,@COMPAMOUNT NUMERIC(15,3)
 ,@PRSN varchar(30)
 ,@PRSNAMOUNT NUMERIC(15,3)
 ,@PIC image
 ,@COMPANY varchar(25)
 ,@TYPEBLOOD varchar(20)
 ,@PASSPORTNUM varchar(20)
 ,@LEAVENUM varchar(10)
 ,@POSBEFORE varchar(15)
 ,@LEAVEDATE datetime
)
4

2 に答える 2

3

間違った投稿でごめんなさい

次に、次のようにc#コードを実行しました。

public class MemberD
{
    public SqlCommand cmd = new SqlCommand();
    public SqlConnection con = new SqlConnection("ConStr");
    public SqlDataReader dr;

    public void UpdateMember(string CODE, int COCODE, Member user)
    {
        cmd.Parameters.Clear(); // Here's  the solution

        //Here I added my SQL parameters 
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        cmd.CommandText = "SP_MSMEMBERS_UPDATE";
        cmd.Connection = con;
        con.Open();
        cmd.ExecuteNonQuery();

        con.Close();
    }
}

重要なのは、グローバル変数としてSqlCommandを使用すると、1回開始されるため、たとえばUpdateメソッドを2回使用したり、GetByIDメソッドを使用したりすると、SQLCommand変数は古いパラメーターも保持するということです。したがって、SPが必要とする以上のパラメーターを渡す と、上記のエラーが発生するため、次のように追加しました 。cmd.Parameters.Clear(); 各メソッドの開始時に。

そして今、それはうまく機能しています。

于 2012-07-07T12:55:11.320 に答える
0

エラーは通常、SPが定義したよりも多くの引数があることを表しています。

確実に伝えるのに十分なコードを提供していないので(より多くのcmdコードブロックと少なくともSPの定義を提供してください)、その場合だと思います。特にこれだけ多くの引数が提供されています。

これは、SqlDatasourcesを処理するときに発生する可能性のある問題でもある可能性があることを読みました。ただし、提供されるコードが限られているため、可能性として指摘しているだけです。

于 2012-07-06T18:05:55.780 に答える