【发布时间】:2014-11-11 14:12:10
【问题描述】:
我有一个包含 11 个文本框和 1 个单选按钮列表(包含两个 LI)的 Web 表单。
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);
【问题讨论】:
-
你有两次@Surname。看看你的页面。
-
其实看看你所有的变量名。复制和粘贴在这方面伤害了你。
-
旁注:对于所有带有
SqlDbType.VarChar的参数,我建议总是定义一个长度!!另外:如果您将参数定义为VARCHAR- 您将获得 1 个字符长度 的字符串!通常这不是你想要的。 明确指定长度 - 总是... -
另外:因为这是一个
INSERT存储过程,你应该调用command.ExecuteNonQuery();- 调用.ExecuteReader()没有意义,因为你没有从执行中取回任何数据反正那个存储过程..... -
请阅读 DRY 概念并提出一个添加参数的函数。
标签: c# sql sql-server sqldatareader