1

エラーが発生しました:

プロシージャまたは関数usp_User_Info3に指定された引数が多すぎます

プログラムを実行するとき。SPまたはC#コードのエラーはわかりません。Vendor_IDユーザーが送信ボタンをクリックした後に表示する必要があります。ここで問題が発生しているのはどこですか?

テーブル構造:

         CREATE TABLE User_Info3 
         ( 
         SNo int Identity (2000,1) ,  
         Vendor_ID AS 'VEN' + CAST(SNo as varchar(16)) PERSISTED PRIMARY KEY, 
         UserName VARCHAR(16) NOT NULL, 
         User_Password VARCHAR(12) NOT NULL, 
         User_ConPassword VARCHAR(12) NOT NULL, 
         User_FirstName VARCHAR(25) NOT NULL, 
         User_LastName VARCHAR(25) SPARSE NULL, 
         User_Title VARCHAR(35) NOT NULL, 
         User_EMail VARCHAR(35) NOT NULL, 
         User_PhoneNo VARCHAR(14) NOT NULL, 
         User_MobileNo VARCHAR(14)NOT NULL, 
         User_FaxNo VARCHAR(14)NOT NULL, 
         UserReg_Date DATE DEFAULT GETDATE() 
         )

ストアドプロシージャ:

         ALTER PROCEDURE [dbo].[usp_User_Info3]
         @SNo INT OUTPUT,
         @Vendor_ID VARCHAR(10) OUTPUT, 
         @UserName VARCHAR(30),
         @User_Password VARCHAR(12),
         @User_ConPassword VARCHAR(12),
         @User_FirstName VARCHAR(25),
         @User_LastName VARCHAR(25),
         @User_Title VARCHAR(35),
         @User_OtherEmail VARCHAR(30),
         @User_PhoneNo VARCHAR(14),
         @User_MobileNo VARCHAR(14),
         @User_FaxNo VARCHAR(14)
         AS
         BEGIN
          SET NOCOUNT ON;
         INSERT INTO User_Info3 (UserName,User_Password,User_ConPassword,User_FirstName,     
         User_LastName,User_Title,User_OtherEmail,User_PhoneNo,User_MobileNo,User_FaxNo)
               VALUES  (@UserName,@User_Password,@User_ConPassword,@User_FirstName,@User_LastName,
               @User_Title,@User_OtherEmail,@User_PhoneNo,@User_MobileNo,@User_FaxNo)
        SET @SNo = Scope_Identity()
        SELECT Vendor_ID From User_Info3 WHERE SNo = @SNo
        END

C#コード:

         protected void BtnUserNext_Click(object sender, EventArgs e)
         {
         cmd.CommandType = CommandType.StoredProcedure;
         cmd.CommandText = "usp_User_Info3";
         System.Data.SqlClient.SqlParameter SNo=cmd.Parameters.Add("@SNo",System.Data.SqlDbType.Int);
         System.Data.SqlClient.SqlParameter Vendor_ID=cmd.Parameters.Add("@Vendor_ID",  
                                                                   System.Data.SqlDbType.VarChar,10);
         cmd.Parameters.Add("@UserName", SqlDbType.VarChar).Value = txtUserName.Text;
         cmd.Parameters.Add("@User_Password", SqlDbType.VarChar).Value = txtRegPassword.Text;
         cmd.Parameters.Add("@User_ConPassword", SqlDbType.VarChar).Value = txtRegConPassword.Text;
         cmd.Parameters.Add("@User_FirstName", SqlDbType.VarChar).Value = txtRegFName.Text;
         cmd.Parameters.Add("@User_LastName", SqlDbType.VarChar).Value = txtRegLName.Text;
         cmd.Parameters.Add("@User_Title", SqlDbType.VarChar).Value = txtRegTitle.Text;
         cmd.Parameters.Add("@User_OtherEmail", SqlDbType.VarChar).Value = txtOtherEmail.Text;
         cmd.Parameters.Add("@User_PhoneNo", SqlDbType.VarChar).Value =txtRegTelephone.Text;
         cmd.Parameters.Add("@User_MobileNo", SqlDbType.VarChar).Value =txtRegMobile.Text;
         cmd.Parameters.Add("@User_FaxNo", SqlDbType.VarChar).Value =txtRegFax.Text;
         cmd.Connection = SqlCon;
         try
         {
          Vendor_ID.Direction = System.Data.ParameterDirection.Output;
          SqlCon.Open();
          cmd.ExecuteNonQuery();
          string VendorID = cmd.ExecuteScalar() as string; 
         }
         catch (Exception ex)
         {
           throw new Exception(ex.Message);
         }
         finally
         {
          string url = "../CompanyBasicInfo.aspx?Parameter=" + Server.UrlEncode(" + VendorID + ");
          SqlCon.Close();
         }
        }
4

5 に答える 5

3
  • @SNoパラメータの方向を設定していません
  • コマンドを2回呼び出しています-ExecuteScalar戻り値が必要な場合は、で呼び出してください。
  • @Vendor_IDストアドプロシージャで出力パラメータの値を設定していません。
于 2012-08-28T09:19:22.143 に答える
1

推測しなければならない場合cmdは、再利用されており、前の呼び出しのパラメーターが残っていることに賭けます。1つのオプションはを呼び出すことcmd.Parameters.Clear()ですが、率直に言って、このインスタンスを再利用する意味はほとんどありませんSqlCommand。毎回新しいコマンドを使用する方がよいでしょう。

using(var cmd = SqlCon.CreateCommand()) {
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "usp_User_Info3";
    // TODO: add parameters
    // TODO: call one of the Execute* methods
}
于 2012-08-28T09:19:35.067 に答える
0

偉大な心からのこれらすべての答えの後、私はあなたがまだ立ち往生しているとは信じられません。これが私の提案です

あなたのPROCで

'maintain this in your parameter
@Vendor_ID VARCHAR(10) OUTPUT,

Selecttoに更新しVendorIDます@VendorID。2行目を参照してください

    SET @SNo = Scope_Identity()
    SELECT @Vendor_ID=VendorID From User_Info3 WHERE SNo = @SNo

ExecuteScalarC#では、 useを呼び出さないでくださいExecuteNonQuery

string newVendorID = "";
try
{
      Vendor_ID.Direction = System.Data.ParameterDirection.Output;
      SqlCon.Open();
      cmd.ExecuteNonQuery();
      if(Vendor_ID.Value != null)
          newVendorID = Vendor_ID.Value.ToString();
}

Vendor_IDパラメータの名前を、などのより意味のある名前に変更できますVendorIDParam。お役に立てれば?

于 2012-08-29T17:36:47.087 に答える
0

User_OtherEmail列がテーブルに存在しません

正しいストアドプロシージャ

Create PROCEDURE [dbo].[usp_User_Info3]
     @SNo INT OUTPUT,
     @Vendor_ID VARCHAR(10) OUTPUT, 
     @UserName VARCHAR(30),
     @User_Password VARCHAR(12),
     @User_ConPassword VARCHAR(12),
     @User_FirstName VARCHAR(25),
     @User_LastName VARCHAR(25),
     @User_Title VARCHAR(35),
      @User_Email VARCHAR(30),
     @User_PhoneNo VARCHAR(14),
     @User_MobileNo VARCHAR(14),
     @User_FaxNo VARCHAR(14)
     AS
     BEGIN
      SET NOCOUNT ON;
     INSERT INTO User_Info3 (UserName,User_Password,User_ConPassword,User_FirstName,     
     User_LastName,User_Title,User_Email,User_PhoneNo,User_MobileNo,User_FaxNo)
           VALUES  (@UserName,@User_Password,@User_ConPassword,@User_FirstName,@User_LastName,
           @User_Title,@User_Email,@User_PhoneNo,@User_MobileNo,@User_FaxNo)
    SET @SNo = Scope_Identity()
    SELECT Vendor_ID From User_Info3 WHERE SNo = @SNo
    END

それに応じて変更されるc#コード

于 2012-08-28T09:21:47.293 に答える
0

すべての回答に感謝します。あなたのアイデアに従ってC#コードとSPを何度も変更した後、最終的に私の質問に対する答えが得られました。SPから「Vendor_ID」を削除し、以下に示すようにコードにいくつかのコードを追加しました。

ストアドプロシージャ:

      ALTER PROCEDURE [dbo].[usp_User_Info3]
      @SNo INT OUTPUT,
      @UserName VARCHAR(30),
      @User_Password VARCHAR(12),
      @User_ConPassword VARCHAR(12),
      @User_FirstName VARCHAR(25),
      @User_LastName VARCHAR(25),
      @User_Title VARCHAR(35),
      @User_OtherEmail VARCHAR(30),
      @User_PhoneNo VARCHAR(14),
      @User_MobileNo VARCHAR(14),
      @User_FaxNo VARCHAR(14)
      AS
      BEGIN
      SET NOCOUNT ON;
      INSERT INTO User_Info3 (UserName,User_Password,User_ConPassword,User_FirstName,User_Title,User_OtherEmail,User_PhoneNo,User_MobileNo,User_FaxNo)
           VALUES (@UserName,@User_Password,@User_ConPassword,@User_FirstName,@User_LastName,@User_Title,@User_OtherEmail,@User_PhoneNo,@User_MobileNo,@User_FaxNo)
  SET @SNo = Scope_Identity() 
      END

C#コード:

    protected void BtnUserNext_Click(object sender, EventArgs e)
    {
    SqlCon.Open();
    SqlCommand cmd2 = new SqlCommand("usp_User_Info3", SqlCon);
    cmd2.CommandType = CommandType.StoredProcedure;
    cmd2.CommandText = "usp_User_Info3";
    System.Data.SqlClient.SqlParameter SNo=cmd2.Parameters.Add("@SNo", System.Data.SqlDbType.Int);
    cmd2.Parameters.Add("@UserName", SqlDbType.VarChar).Value = txtUserName.Text.Trim();
    cmd2.Parameters.Add("@User_Password", SqlDbType.VarChar).Value = txtRegPassword.Text.Trim();
    cmd2.Parameters.Add("@User_ConPassword", SqlDbType.VarChar).Value = txtRegConPassword.Text;
    cmd2.Parameters.Add("@User_FirstName", SqlDbType.VarChar).Value = txtRegFName.Text.Trim();
    cmd2.Parameters.Add("@User_LastName", SqlDbType.VarChar).Value = txtRegLName.Text.Trim();
    cmd2.Parameters.Add("@User_Title", SqlDbType.VarChar).Value = txtRegTitle.Text.Trim();
    cmd2.Parameters.Add("@User_OtherEmail", SqlDbType.VarChar).Value = txtOtherEmail.Text.Trim();
    cmd2.Parameters.Add("@User_PhoneNo", SqlDbType.VarChar).Value = txtRegCode1.Text;
    cmd2.Parameters.Add("@User_MobileNo", SqlDbType.VarChar).Value = txtRegCode2.Text;
    cmd2.Parameters.Add("@User_FaxNo", SqlDbType.VarChar).Value = txtRegCode3.Text;
    cmd2.Connection = SqlCon;
    try
    {
       SNo.Direction = System.Data.ParameterDirection.Output;
       cmd2.ExecuteScalar();
       string VendorID = "VEN" + cmd2.Parameters["@SNo"].Value.ToString();
    }
    finally
    {
    string url = "../CompanyBasicInfo.aspx?Parameter=" + Server.UrlEncode(" + VendorID + ");
    ClientScript.RegisterStartupScript(this.GetType(), "callfunction", "alert('Login created successfully');window.location.href = '" + url + "';", true);
     SqlCon.Close();
     }
    }
于 2012-09-01T10:10:40.603 に答える