簡體   English   中英

C#SQL數據讀取器錯誤

[英]C# Sql Data Reader error

我有一個包含11個文本框和1個單選按鈕列表的Web表單(包含兩個LI)。

txtCustID必需(通過從數據庫獲取最大CustID編號並遞增值生成)

txtFirstname - Requried
txtSurname - Required
rdbGender -> Male, Female - Required
txtAge - Required
txtAddress1 - Requried
txtAddress2 - Not required
txtCity - Required
txtPhone - Required
txtMobile - Not required
txtEmail1 - Required
txtEmail2 - Required (Used to confirm Email1, not passed to DB)

有一個按鈕btnAdd,它將文本值傳遞到數據庫中的存儲過程“ AddRecord”。

它返回錯誤“過程或函數'AddRecord'期望參數'@Surname',但未提供”。

我找不到問題,因為提供了@Surname?

這是btnClick事件代碼:

protected void btnAdd_Click(object sender, EventArgs e)
{
        SqlCommand command = new SqlCommand();

        command.Connection = conn;
        command.CommandType = CommandType.StoredProcedure;
        command.CommandText = "AddRecord";
        command.Connection.Open();

        SqlParameter pCustID = new SqlParameter();
        pCustID.ParameterName = "@CustID";
        pCustID.SqlDbType = SqlDbType.Int;
        pCustID.Direction = ParameterDirection.Input;
        pCustID.Value = txtCustID.Text;
        command.Parameters.Add(pCustID);

        SqlParameter pFirst = new SqlParameter();
        pFirst.ParameterName = "@First";
        pFirst.SqlDbType = SqlDbType.VarChar;
        pFirst.Direction = ParameterDirection.Input;
        pFirst.Value = txtFirstName.Text;
        command.Parameters.Add(pFirst);

        SqlParameter pSurn = new SqlParameter();
        pSurn.ParameterName = "@Surname";
        pSurn.SqlDbType = SqlDbType.VarChar;
        pSurn.Direction = ParameterDirection.Input;
        pSurn.Value = txtSurname.Text;
        command.Parameters.Add(pSurn);

        SqlParameter pGen = new SqlParameter();
        pSurn.ParameterName = "@Gender";
        pSurn.SqlDbType = SqlDbType.VarChar;
        pSurn.Direction = ParameterDirection.Input;
        pSurn.Value = rblGender.SelectedValue;
        command.Parameters.Add(pGen);

        SqlParameter pAge = new SqlParameter();
        pSurn.ParameterName = "@Surname";
        pSurn.SqlDbType = SqlDbType.Int;
        pSurn.Direction = ParameterDirection.Input;
        pSurn.Value = txtAge.Text;
        command.Parameters.Add(pAge);

        SqlParameter pAdd1 = new SqlParameter();
        pSurn.ParameterName = "@Address1";
        pSurn.SqlDbType = SqlDbType.VarChar;
        pSurn.Direction = ParameterDirection.Input;
        pSurn.Value = txtAddress1.Text;
        command.Parameters.Add(pAdd1);

        SqlParameter pAdd2 = new SqlParameter();
        pSurn.ParameterName = "@Address2";
        pSurn.SqlDbType = SqlDbType.VarChar;
        pSurn.Direction = ParameterDirection.Input;
        pSurn.Value = txtAddress2.Text;
        command.Parameters.Add(pAdd2);

        SqlParameter pCity = new SqlParameter();
        pSurn.ParameterName = "@City";
        pSurn.SqlDbType = SqlDbType.VarChar;
        pSurn.Direction = ParameterDirection.Input;
        pSurn.Value = txtCity.Text;
        command.Parameters.Add(pCity);

        SqlParameter pPhone = new SqlParameter();
        pSurn.ParameterName = "@Phone";
        pSurn.SqlDbType = SqlDbType.VarChar;
        pSurn.Direction = ParameterDirection.Input;
        pSurn.Value = txtPhone.Text;
        command.Parameters.Add(pPhone);

        SqlParameter pMobile = new SqlParameter();
        pSurn.ParameterName = "@Mobile";
        pSurn.SqlDbType = SqlDbType.VarChar;
        pSurn.Direction = ParameterDirection.Input;
        pSurn.Value = txtMobile.Text;
        command.Parameters.Add(pMobile);

        SqlParameter pEmail = new SqlParameter();
        pSurn.ParameterName = "@Email";
        pSurn.SqlDbType = SqlDbType.VarChar;
        pSurn.Direction = ParameterDirection.Input;
        pSurn.Value = txtEmail1.Text;
        command.Parameters.Add(pEmail);

        SqlDataReader reader = command.ExecuteReader();

        reader.Dispose();
        command.Dispose();
        conn.Dispose();
    }
}

這是存儲過程代碼:

CREATE PROCEDURE AddRecord
    @CustID INT,
    @First VARCHAR,
    @Surname VARCHAR,
    @Gender VARCHAR,
    @Age INT, 
    @Address1 VARCHAR,
    @Address2 VARCHAR,
    @City VARCHAR,
    @Phone VARCHAR,
    @Mobile VARCHAR,
    @Email VARCHAR
AS
    INSERT INTO Customer
    VALUES
      (@CustID, @First, @Surname, @Gender, @Age, @Address1,  @Address2,
       @City, @Phone, @Mobile, @Email);

在將pSurn初始化后,您已經為所有所有參數的其余部分引用了相同的變量,並且還為Age參數將參數名稱指定為“ @Surname” ...
試試下面

    protected void btnAdd_Click(object sender, EventArgs e)
    {
        SqlCommand command = new SqlCommand();

        command.Connection = conn;
        command.CommandType = CommandType.StoredProcedure;
        command.CommandText = "AddRecord";
        command.Connection.Open();

        SqlParameter pCustID = new SqlParameter();
        pCustID.ParameterName = "@CustID";
        pCustID.SqlDbType = SqlDbType.Int;
        pCustID.Direction = ParameterDirection.Input;
        pCustID.Value = txtCustID.Text;
        command.Parameters.Add(pCustID);

        SqlParameter pFirst = new SqlParameter();
        pFirst.ParameterName = "@First";
        pFirst.SqlDbType = SqlDbType.VarChar;
        pFirst.Direction = ParameterDirection.Input;
        pFirst.Value = txtFirstName.Text;
        command.Parameters.Add(pFirst);

        SqlParameter pSurn = new SqlParameter();
        pSurn.ParameterName = "@Surname";
        pSurn.SqlDbType = SqlDbType.VarChar;
        pSurn.Direction = ParameterDirection.Input;
        pSurn.Value = txtSurname.Text;
        command.Parameters.Add(pSurn);

        SqlParameter pGen = new SqlParameter();
        pGen.ParameterName = "@Gender";
        pGen.SqlDbType = SqlDbType.VarChar;
        pGen.Direction = ParameterDirection.Input;
        pGen.Value = rblGender.SelectedValue;
        command.Parameters.Add(pGen);

        SqlParameter pAge = new SqlParameter();
        pAge.ParameterName = "@Age";
        pAge.SqlDbType = SqlDbType.Int;
        pAge.Direction = ParameterDirection.Input;
        pAge.Value = txtAge.Text;
        command.Parameters.Add(pAge);

        SqlParameter pAdd1 = new SqlParameter();
        pAdd1.ParameterName = "@Address1";
        pAdd1.SqlDbType = SqlDbType.VarChar;
        pAdd1.Direction = ParameterDirection.Input;
        pAdd1.Value = txtAddress1.Text;
        command.Parameters.Add(pAdd1);

        SqlParameter pAdd2 = new SqlParameter();
        pAdd2.ParameterName = "@Address2";
        pAdd2.SqlDbType = SqlDbType.VarChar;
        pAdd2.Direction = ParameterDirection.Input;
        pAdd2.Value = txtAddress2.Text;
        command.Parameters.Add(pAdd2);

        SqlParameter pCity = new SqlParameter();
        pCity.ParameterName = "@City";
        pCity.SqlDbType = SqlDbType.VarChar;
        pCity.Direction = ParameterDirection.Input;
        pCity.Value = txtCity.Text;
        command.Parameters.Add(pCity);

        SqlParameter pPhone = new SqlParameter();
        pPhone.ParameterName = "@Phone";
        pPhone.SqlDbType = SqlDbType.VarChar;
        pPhone.Direction = ParameterDirection.Input;
        pPhone.Value = txtPhone.Text;
        command.Parameters.Add(pPhone);

        SqlParameter pMobile = new SqlParameter();
        pMobile.ParameterName = "@Mobile";
        pMobile.SqlDbType = SqlDbType.VarChar;
        pMobile.Direction = ParameterDirection.Input;
        pMobile.Value = txtMobile.Text;
        command.Parameters.Add(pMobile);

        SqlParameter pEmail = new SqlParameter();
        pEmail.ParameterName = "@Email";
        pEmail.SqlDbType = SqlDbType.VarChar;
        pEmail.Direction = ParameterDirection.Input;
        pEmail.Value = txtEmail1.Text;
        command.Parameters.Add(pEmail);

        SqlDataReader reader = command.ExecuteReader();

        reader.Dispose();
        command.Dispose();
        conn.Dispose();
    }
}

這里有大量可疑物品。

  1. 永遠不要自己進行自動遞增。 我知道的所有數據庫都可以為您執行此操作。
  2. 更改每個參數的變量名。 好像您要使用pSurn並進行了一些復制和粘貼。 這段代碼實際上真的需要清理工作,而不是其他任何事情。

這確實不是一個很大的答案,但我希望這能使您朝正確的方向前進。

嘗試這個

protected void btnAdd_Click(object sender, EventArgs e)
    {
        SqlCommand command = new SqlCommand();

        command.Connection = conn;
        command.CommandType = CommandType.StoredProcedure;
        command.CommandText = "AddRecord";
        command.Connection.Open();

        SqlParameter pCustID = new SqlParameter();
        pCustID.ParameterName = "@CustID";
        pCustID.SqlDbType = SqlDbType.Int;
        pCustID.Direction = ParameterDirection.Input;
        pCustID.Value = txtCustID.Text;
        command.Parameters.Add(pCustID);

        SqlParameter pFirst = new SqlParameter();
        pFirst.ParameterName = "@First";
        pFirst.SqlDbType = SqlDbType.VarChar;
        pFirst.Direction = ParameterDirection.Input;
        pFirst.Value = txtFirstName.Text;
        command.Parameters.Add(pFirst);

        SqlParameter pSurn = new SqlParameter();
        pSurn.ParameterName = "@Surname";
        pSurn.SqlDbType = SqlDbType.VarChar;
        pSurn.Direction = ParameterDirection.Input;
        pSurn.Value = txtSurname.Text;
        command.Parameters.Add(pSurn);

        SqlParameter pGen = new SqlParameter();
        pSurn.ParameterName = "@Gender";
        pSurn.SqlDbType = SqlDbType.VarChar;
        pSurn.Direction = ParameterDirection.Input;
        pSurn.Value = rblGender.SelectedValue;
        command.Parameters.Add(pGen);

        SqlParameter pAge = new SqlParameter();
        pSurn.ParameterName = "@Age";
        pSurn.SqlDbType = SqlDbType.Int;
        pSurn.Direction = ParameterDirection.Input;
        pSurn.Value = txtAge.Text;
        command.Parameters.Add(pAge);

        SqlParameter pAdd1 = new SqlParameter();
        pSurn.ParameterName = "@Address1";
        pSurn.SqlDbType = SqlDbType.VarChar;
        pSurn.Direction = ParameterDirection.Input;
        pSurn.Value = txtAddress1.Text;
        command.Parameters.Add(pAdd1);

        SqlParameter pAdd2 = new SqlParameter();
        pSurn.ParameterName = "@Address2";
        pSurn.SqlDbType = SqlDbType.VarChar;
        pSurn.Direction = ParameterDirection.Input;
        pSurn.Value = txtAddress2.Text;
        command.Parameters.Add(pAdd2);

        SqlParameter pCity = new SqlParameter();
        pSurn.ParameterName = "@City";
        pSurn.SqlDbType = SqlDbType.VarChar;
        pSurn.Direction = ParameterDirection.Input;
        pSurn.Value = txtCity.Text;
        command.Parameters.Add(pCity);

        SqlParameter pPhone = new SqlParameter();
        pSurn.ParameterName = "@Phone";
        pSurn.SqlDbType = SqlDbType.VarChar;
        pSurn.Direction = ParameterDirection.Input;
        pSurn.Value = txtPhone.Text;
        command.Parameters.Add(pPhone);

        SqlParameter pMobile = new SqlParameter();
        pSurn.ParameterName = "@Mobile";
        pSurn.SqlDbType = SqlDbType.VarChar;
        pSurn.Direction = ParameterDirection.Input;
        pSurn.Value = txtMobile.Text;
        command.Parameters.Add(pMobile);

        SqlParameter pEmail = new SqlParameter();
        pSurn.ParameterName = "@Email";
        pSurn.SqlDbType = SqlDbType.VarChar;
        pSurn.Direction = ParameterDirection.Input;
        pSurn.Value = txtEmail1.Text;
        command.Parameters.Add(pEmail);

        SqlDataReader reader = command.ExecuteReader();

        reader.Dispose();
        command.Dispose();
        conn.Dispose();
    }
}

在您的年齡字段中,您使用的是@Surname。請更改該值,然后重試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM