将列表框保存到 SQL 数据库,"Procedure or function Music_Add has too many arguments specified"

Save listbox to SQL database, "Procedure or function Music_Add has too many arguments specified"

Here is the stored procedure on my DB。我想将列表数据保存到我的 SQL 数据库中,我可以保存一个数据,但是当我尝试添加更多数据时,它会导致错误,如“过程或函数 Music_Add 指定了太多参数”。有人可以帮我解决这个错误吗...谢谢... 这是将列表保存到数据库的代码:

private void btnsave_Click(object sender, EventArgs e)
    {
        string username = dtuser;
        conn.Open();
        SqlCommand cmd = new SqlCommand("Music_Add", conn);
        cmd.CommandType = CommandType.StoredProcedure;
        foreach (var item in fav_list.Items)
        {
            cmd.Parameters.AddWithValue("@username", username);
            cmd.Parameters.AddWithValue("@music", item.ToString());
            cmd.ExecuteNonQuery();
        }
        cmd.Dispose();
        conn.Close();
    }

考虑更像这样的事情:

private void btnsave_Click(object sender, EventArgs e)
{
    string username = dtuser;
    using var cmd = new SqlCommand("Music_Add", "conn str here");
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("@username", SqlDbType.VarChar, COLUMN_SIZE_HERE);
    cmd.Parameters.Add("@music", SqlDbType.VarChar, COLUMN_SIZE_HERE);
    cmd.Connection.Open();
    foreach (var item in fav_list.Items)
    {
        cmd.Parameters["@username"].Value = username;
        cmd.Parameters["@music"].Value = item.ToString());
        cmd.ExecuteNonQuery();
    }
}
  • 使用string/string版本的SqlCommand;处理起来少了一件事情,并且不会让您陷入保留 SqlConnection 变量的诱惑;很容易忘记关闭它(或遇到异常而未到达关闭代码),然后您会泄漏连接。如果您在事务中注册多个命令,您只需要携带 SqlConnections
  • 使用using - 它不会忘记处理,即使发生错误
  • 创建一次参数,并在参数中使用与列宽相同的大小。请参阅 Dan Guzman 关于使用 AddWithValue 的博客 - 我很高兴阅读一个实际参数化而不是冒险 SQL 注入的问题,但请注意,在某些情况下使用 AddWithValue 可能会导致性能下降。在这种情况下,它不太可能影响您,但通常 在 SQLServer 上,这只是一个需要记住的经验法则,养成避免 AWV 而不是尝试工作的习惯什么时候安全,什么时候出问题
  • 在循环中重复设置您的值并执行查询。您甚至可以考虑使用 table 值参数集进行批处理,以获得更好的性能