【问题标题】:The parameterized query expects'@firstname nvarchar, @lastname nvarchar, @phone nvarchar expects the parameter @email, which was not supplied [duplicate]参数化查询需要'@firstname nvarchar、@lastname nvarchar、@phone nvarchar 需要参数 @email,但未提供 [重复]
【发布时间】:2020-07-20 01:03:53
【问题描述】:

有没有大师可以帮助我解决这个问题?我一直在 C# 中抛出这个异常,但我能看到的一切似乎都是正确的。这是代码

  public bool Insert(loginBLL u)
    {
        bool isSuccess = false;
        SqlConnection conn = new SqlConnection(myconnstrng);

        try
        {
            String sql = "INSERT INTO customers (firstname, lastname, phone, email, address, city, state, zipcode, password, username) VALUES (@firstname, @lastname, @phone, @email, @address, @city, @state, @zipcode, @password, @username)";
            SqlCommand cmd = new SqlCommand(sql, conn);

            cmd.Parameters.AddWithValue("@firstname", u.firstname);
            cmd.Parameters.AddWithValue("@lastname", u.lastname);
            cmd.Parameters.AddWithValue("@phone", u.phone);
            cmd.Parameters.AddWithValue("@email", u.email);
            cmd.Parameters.AddWithValue("@address", u.address);
            cmd.Parameters.AddWithValue("@city", u.city);
            cmd.Parameters.AddWithValue("@state", u.state);
            cmd.Parameters.AddWithValue("@zipcode", u.zipcode);
            cmd.Parameters.AddWithValue("@password", u.password);
            cmd.Parameters.AddWithValue("@username", u.username);

         
            conn.Open();

            int rows = cmd.ExecuteNonQuery();

【问题讨论】:

  • 我建议避免使用AddWithValue(),而是添加具有显式类型的参数。
  • @GordonLinoff 所以改用 cmd.Parameters.Add("@firstname", SqlDbType,varchar);
  • 还有空值? .AddWithValue("xxx", u.xxx ?? DBNull.Value);
  • 检查所有参数,您将 null 传递给不可为空的列,我建议使用 parameters.add
  • u.emailnull(检查重复项)。

标签: c# sql


【解决方案1】:

我怀疑您的问题是由于将 (object)null 而不是 DBNull.Value 传递给 null 参数。

这些天来,我会通过编写一个扩展方法来绑定来自FormattableString 的参数,从而避免所有这些参数样板。

        public static SqlCommand GetCommandInterpolated(this SqlConnection conn, FormattableString sql)
        {
            var cmd = conn.CreateCommand();
            var replacements = new string[sql.ArgumentCount];
            var args = sql.GetArguments();

            for (int i = 0; i < sql.ArgumentCount; i++)
            {
                var p = cmd.CreateParameter();
                cmd.Parameters.Add(p);
                p.ParameterName = replacements[i] = $"@p_{i}";
                p.Value = args[i] ?? DBNull.Value;
            }
            cmd.CommandText = string.Format(sql.Format, replacements);
            return cmd;
        }


        var cmd = conn.GetCommandInterpolated(
            $@"INSERT INTO customers (firstname, lastname, phone, email, address, city, state, zipcode, password, username)
            VALUES ({u.firstname}, {u.lastname}, {u.phone}, {u.email}, {u.address}, {u.city}, {u.state}, {u.zipcode}, {u.password}, {u.username}"
        );

【讨论】:

  • 谢谢大家。问题解决了,只能创建一个新的。感谢所有的意见和帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多