【问题标题】:C# Sql Data Reader errorC# Sql 数据读取器错误
【发布时间】: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


【解决方案1】:

在 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();
    }
}

【讨论】:

  • 你做的工作比我准备做的要多。赞一个!
【解决方案2】:

这里有大量可疑物品。

  1. 永远不要自己进行自动递增。我知道的所有数据库都可以为您执行此操作。
  2. 更改每个参数的变量名称。看起来好像你到了 pSurn 并做了一些复制和粘贴。这段代码真的比什么都需要清理工作。

这真的不是一个很好的答案,但我希望这能让你朝着正确的方向前进。

【讨论】:

    【解决方案3】:

    试试这个

    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。更改并重试

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多